@lunarhue/expo-wa-sqlite 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +9 -0
- package/.lovely-docs.yaml +11 -0
- package/LICENSE +21 -0
- package/demo/next.config.mjs +17 -0
- package/demo/package.json +26 -0
- package/demo/scripts/copy-wasm.mjs +14 -0
- package/demo/src/app/layout.tsx +16 -0
- package/demo/src/app/page.tsx +16 -0
- package/demo/src/app/todos.tsx +118 -0
- package/demo/src/db/schema.ts +7 -0
- package/demo/tsconfig.json +18 -0
- package/lovely-docs/drizzle-orm/arktype.md +113 -0
- package/lovely-docs/drizzle-orm/batch-api.md +35 -0
- package/lovely-docs/drizzle-orm/cache.md +145 -0
- package/lovely-docs/drizzle-orm/check-migrations.md +52 -0
- package/lovely-docs/drizzle-orm/column_types/mysql-column-types.md +76 -0
- package/lovely-docs/drizzle-orm/column_types/postgresql_column_types.md +314 -0
- package/lovely-docs/drizzle-orm/column_types/singlestore-column-types.md +171 -0
- package/lovely-docs/drizzle-orm/column_types/sqlite_column_types.md +132 -0
- package/lovely-docs/drizzle-orm/column_types.md +76 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/case-insensitive-unique-email.md +113 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/conditional-filters-in-query.md +69 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/count-rows.md +76 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/cursor-based-pagination.md +142 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/d1_http_api_configuration.md +49 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/decrementing-a-value.md +36 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/empty-array-default-value.md +43 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/full-text-search-with-generated-columns.md +73 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/gel-auth-extension.md +89 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/include-or-exclude-columns.md +51 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/incrementing-a-value.md +36 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/limit-offset-pagination.md +104 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/mysql-local-setup.md +55 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/point-datatype-psql.md +79 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/postgis-geometry-point.md +115 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/postgresql-full-text-search.md +150 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/postgresql-local-setup.md +55 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/seeding-with-option.md +69 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/seeding-with-partially-exposed-schema.md +60 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/select-parent-rows-with-at-least-one-related-child-row.md +74 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/timestamp-default-value.md +93 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/toggling-a-boolean-field.md +20 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/update-many-with-different-values.md +50 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/upsert.md +169 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes/vector-similarity-search.md +79 -0
- package/lovely-docs/drizzle-orm/common_patterns_&_recipes.md +787 -0
- package/lovely-docs/drizzle-orm/connect-aws-data-api-pg.md +47 -0
- package/lovely-docs/drizzle-orm/connect-bun-sql.md +35 -0
- package/lovely-docs/drizzle-orm/connect-bun-sqlite.md +42 -0
- package/lovely-docs/drizzle-orm/connect-cloudflare-d1.md +61 -0
- package/lovely-docs/drizzle-orm/connect-cloudflare-do.md +86 -0
- package/lovely-docs/drizzle-orm/connect-neon.md +72 -0
- package/lovely-docs/drizzle-orm/connect-nile.md +84 -0
- package/lovely-docs/drizzle-orm/connect-pglite.md +39 -0
- package/lovely-docs/drizzle-orm/connect-planetscale.md +37 -0
- package/lovely-docs/drizzle-orm/connect-prisma-postgres.md +48 -0
- package/lovely-docs/drizzle-orm/connect-sqlite-cloud.md +29 -0
- package/lovely-docs/drizzle-orm/connect-supabase.md +45 -0
- package/lovely-docs/drizzle-orm/connect-tidb-serverless.md +35 -0
- package/lovely-docs/drizzle-orm/connect-turso-database.md +28 -0
- package/lovely-docs/drizzle-orm/connect-turso.md +60 -0
- package/lovely-docs/drizzle-orm/connect-vercel-postgres.md +37 -0
- package/lovely-docs/drizzle-orm/connect-xata.md +29 -0
- package/lovely-docs/drizzle-orm/custom-migrations.md +40 -0
- package/lovely-docs/drizzle-orm/custom-types.md +137 -0
- package/lovely-docs/drizzle-orm/database-connection-overview.md +89 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/bun-sql-existing.md +59 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/bun-sqlite-existing.md +48 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/bun-sqlite-new.md +34 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/d1-new.md +74 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/expo-sqlite-setup.md +169 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/gel-existing-project.md +81 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/get-started-bun-sql.md +29 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/getting_started_with_gel.md +85 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/mysql-existing-project.md +32 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/mysql-setup.md +43 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/neon-existing-project.md +39 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/neon-setup.md +45 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/nile-existing-project.md +66 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/nile-setup.md +59 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/op-sqlite_setup_guide.md +135 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/pglite-existing-project.md +67 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/pglite-setup.md +33 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/planetscale-existing-project.md +70 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/planetscale-setup.md +46 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/postgresql-existing-project.md +57 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/postgresql-setup.md +44 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/singlestore-existing-project.md +22 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/singlestore-setup.md +37 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/sqlite-cloud-existing-project.md +52 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/sqlite-cloud-setup.md +53 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/sqlite-durable-objects-setup.md +163 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/sqlite-existing-project.md +36 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/sqlite-new.md +28 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/supabase-existing-project.md +32 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/tidb-existing-project.md +25 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/tidb-serverless-setup.md +41 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/turso-database-existing.md +61 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/turso-database-setup.md +60 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/turso-existing.md +74 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/turso-new.md +78 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/vercel-postgres-existing-project.md +71 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/vercel-postgres-setup.md +46 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/xata-existing-project.md +32 -0
- package/lovely-docs/drizzle-orm/database_setup_guides/xata-new.md +30 -0
- package/lovely-docs/drizzle-orm/database_setup_guides.md +144 -0
- package/lovely-docs/drizzle-orm/delete.md +57 -0
- package/lovely-docs/drizzle-orm/drizzle-config-file.md +252 -0
- package/lovely-docs/drizzle-orm/drizzle-kit-up.md +43 -0
- package/lovely-docs/drizzle-orm/dynamic-query-building.md +68 -0
- package/lovely-docs/drizzle-orm/eslint-plugin.md +76 -0
- package/lovely-docs/drizzle-orm/expo-sqlite.md +101 -0
- package/lovely-docs/drizzle-orm/export.md +88 -0
- package/lovely-docs/drizzle-orm/faq.md +28 -0
- package/lovely-docs/drizzle-orm/filter-and-conditional-operators.md +169 -0
- package/lovely-docs/drizzle-orm/gel-setup.md +37 -0
- package/lovely-docs/drizzle-orm/generate.md +119 -0
- package/lovely-docs/drizzle-orm/generated-columns.md +128 -0
- package/lovely-docs/drizzle-orm/getting_started/database_integrations/drizzle-with-turso.md +159 -0
- package/lovely-docs/drizzle-orm/getting_started/database_integrations/drizzle_with_nile_database.md +195 -0
- package/lovely-docs/drizzle-orm/getting_started/database_integrations/neon_postgres_integration.md +157 -0
- package/lovely-docs/drizzle-orm/getting_started/database_integrations/supabase_integration.md +150 -0
- package/lovely-docs/drizzle-orm/getting_started/database_integrations/vercel-postgres-setup.md +152 -0
- package/lovely-docs/drizzle-orm/getting_started/database_integrations/xata_integration.md +143 -0
- package/lovely-docs/drizzle-orm/getting_started/database_integrations.md +117 -0
- package/lovely-docs/drizzle-orm/getting_started/edge_functions_integration/drizzle_with_vercel_edge_functions.md +220 -0
- package/lovely-docs/drizzle-orm/getting_started/edge_functions_integration/netlify_edge_functions_with_neon_postgres.md +120 -0
- package/lovely-docs/drizzle-orm/getting_started/edge_functions_integration/netlify_edge_functions_with_supabase.md +94 -0
- package/lovely-docs/drizzle-orm/getting_started/edge_functions_integration/supabase_edge_functions_integration.md +116 -0
- package/lovely-docs/drizzle-orm/getting_started/edge_functions_integration.md +63 -0
- package/lovely-docs/drizzle-orm/getting_started/todo_app_with_neon_postgres.md +323 -0
- package/lovely-docs/drizzle-orm/getting_started.md +443 -0
- package/lovely-docs/drizzle-orm/graphql.md +107 -0
- package/lovely-docs/drizzle-orm/http-proxy-driver.md +138 -0
- package/lovely-docs/drizzle-orm/indexes-constraints.md +135 -0
- package/lovely-docs/drizzle-orm/insert.mdx.md +118 -0
- package/lovely-docs/drizzle-orm/joins.md +145 -0
- package/lovely-docs/drizzle-orm/kit-overview.md +81 -0
- package/lovely-docs/drizzle-orm/migrate.md +54 -0
- package/lovely-docs/drizzle-orm/migration_guides/migrate-from-sequelize.md +335 -0
- package/lovely-docs/drizzle-orm/migration_guides/migrate-from-typeorm.md +317 -0
- package/lovely-docs/drizzle-orm/migration_guides/migrate_from_prisma_to_drizzle.md +258 -0
- package/lovely-docs/drizzle-orm/migration_guides.md +201 -0
- package/lovely-docs/drizzle-orm/migrations.md +50 -0
- package/lovely-docs/drizzle-orm/mysql-setup.md +51 -0
- package/lovely-docs/drizzle-orm/op-sqlite-setup.md +80 -0
- package/lovely-docs/drizzle-orm/overview.md +69 -0
- package/lovely-docs/drizzle-orm/postgresql-setup.md +71 -0
- package/lovely-docs/drizzle-orm/postgresql_extensions.md +93 -0
- package/lovely-docs/drizzle-orm/prepared-statements.md +77 -0
- package/lovely-docs/drizzle-orm/prisma-extension.md +46 -0
- package/lovely-docs/drizzle-orm/pull.md +134 -0
- package/lovely-docs/drizzle-orm/push.md +129 -0
- package/lovely-docs/drizzle-orm/queries-and-crud.md +72 -0
- package/lovely-docs/drizzle-orm/quick-start.md +63 -0
- package/lovely-docs/drizzle-orm/react-native-sqlite-setup.md +1 -0
- package/lovely-docs/drizzle-orm/read-replicas.md +66 -0
- package/lovely-docs/drizzle-orm/relational-queries.md +271 -0
- package/lovely-docs/drizzle-orm/relations.md +194 -0
- package/lovely-docs/drizzle-orm/release_notes/live-queries.md +27 -0
- package/lovely-docs/drizzle-orm/release_notes/pglite_driver_support.md +14 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.11.0_release.md +139 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.16.2_release_notes.md +86 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.23.2_release.md +5 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.27.2_-_unique_constraints_support.md +66 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.28.0_release_notes.md +80 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.28.1_release.md +7 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.28.2_release_notes.md +18 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.28.3_release_notes.md +48 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.28.4_release.md +8 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.28.5_release_notes.md +7 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.28.6_release_notes.md +54 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.29.0_release_notes.md +143 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.29.1_release_notes.md +72 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.29.2_release_notes.md +95 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.29.3_release.md +7 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.29.4_release_notes.md +40 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.29.5_release_notes.md +69 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.30.0_release_notes.md +31 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.30.10_release.md +18 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.30.1_release_notes.md +16 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.30.2_release_notes.md +7 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.30.3_release_notes.md +8 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.30.5_release_notes.md +20 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.30.7_release.md +5 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.30.8_release_notes.md +36 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.30.9_release.md +29 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.31.0_release_notes.md +186 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.31.2_tidb_cloud_serverless_support.md +16 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.31.3_release.md +19 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.31.4_release.md +1 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.32.0_release_notes.md +136 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.32.1_release_notes.md +15 -0
- package/lovely-docs/drizzle-orm/release_notes/v0.32.2_release.md +13 -0
- package/lovely-docs/drizzle-orm/release_notes/xata-http-driver-support.md +27 -0
- package/lovely-docs/drizzle-orm/release_notes.md +25 -0
- package/lovely-docs/drizzle-orm/rls.mdx.md +385 -0
- package/lovely-docs/drizzle-orm/schema-declaration.md +239 -0
- package/lovely-docs/drizzle-orm/schemas.md +63 -0
- package/lovely-docs/drizzle-orm/seed-generators.md +220 -0
- package/lovely-docs/drizzle-orm/seed-limitations.md +3 -0
- package/lovely-docs/drizzle-orm/seed-overview.md +155 -0
- package/lovely-docs/drizzle-orm/seed-versioning.md +85 -0
- package/lovely-docs/drizzle-orm/select.md +411 -0
- package/lovely-docs/drizzle-orm/sequences.md +62 -0
- package/lovely-docs/drizzle-orm/serverless-performance.md +21 -0
- package/lovely-docs/drizzle-orm/set-operations.md +127 -0
- package/lovely-docs/drizzle-orm/singlestore-setup.md +57 -0
- package/lovely-docs/drizzle-orm/sql-template.md +127 -0
- package/lovely-docs/drizzle-orm/sqlite-setup.md +65 -0
- package/lovely-docs/drizzle-orm/studio.md +47 -0
- package/lovely-docs/drizzle-orm/transactions.md +83 -0
- package/lovely-docs/drizzle-orm/type-helpers-and-utilities.md +160 -0
- package/lovely-docs/drizzle-orm/typebox.md +110 -0
- package/lovely-docs/drizzle-orm/update.md +79 -0
- package/lovely-docs/drizzle-orm/upgrade-to-0.21.0.md +40 -0
- package/lovely-docs/drizzle-orm/valibot.md +115 -0
- package/lovely-docs/drizzle-orm/views.md +135 -0
- package/lovely-docs/drizzle-orm/why-drizzle.md +66 -0
- package/lovely-docs/drizzle-orm/zod.md +113 -0
- package/lovely-docs/drizzle-orm.md +60 -0
- package/package.json +24 -0
- package/src/index.ts +186 -0
- package/tsconfig.json +14 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
## Headless TypeScript ORM
|
|
2
|
+
|
|
3
|
+
Drizzle is a headless TypeScript ORM designed to let you build projects your way without forcing a specific structure. Unlike traditional data frameworks, Drizzle doesn't require building projects around it.
|
|
4
|
+
|
|
5
|
+
### Core Philosophy
|
|
6
|
+
|
|
7
|
+
**SQL-like API**: If you know SQL, you know Drizzle. The library embraces SQL rather than abstracting it away, eliminating the double learning curve of learning both SQL and a framework API.
|
|
8
|
+
|
|
9
|
+
**Relational Query API**: For common scenarios where SQL-like queries aren't optimal, Drizzle provides a Queries API for fetching nested relational data conveniently. Drizzle always outputs exactly 1 SQL query, making it serverless-friendly.
|
|
10
|
+
|
|
11
|
+
### Key Features
|
|
12
|
+
|
|
13
|
+
- **Dual Query APIs**: Both SQL-like and relational query interfaces
|
|
14
|
+
- **Schema Definition**: Define and manage database schemas in TypeScript
|
|
15
|
+
- **Automatic Migrations**: Generate migrations from schema changes
|
|
16
|
+
- **Zero Dependencies**: 31KB slim library, serverless-ready by design
|
|
17
|
+
- **Multi-Database Support**: PostgreSQL, MySQL, SQLite, SingleStore with native driver support
|
|
18
|
+
- **Type-Safe**: Full TypeScript support
|
|
19
|
+
|
|
20
|
+
### Examples
|
|
21
|
+
|
|
22
|
+
Schema definition:
|
|
23
|
+
```typescript
|
|
24
|
+
export const countries = pgTable('countries', {
|
|
25
|
+
id: serial('id').primaryKey(),
|
|
26
|
+
name: varchar('name', { length: 256 }),
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
export const cities = pgTable('cities', {
|
|
30
|
+
id: serial('id').primaryKey(),
|
|
31
|
+
name: varchar('name', { length: 256 }),
|
|
32
|
+
countryId: integer('country_id').references(() => countries.id),
|
|
33
|
+
});
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
SQL-like query:
|
|
37
|
+
```typescript
|
|
38
|
+
await db
|
|
39
|
+
.select()
|
|
40
|
+
.from(countries)
|
|
41
|
+
.leftJoin(cities, eq(cities.countryId, countries.id))
|
|
42
|
+
.where(eq(countries.id, 10))
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Relational query:
|
|
46
|
+
```typescript
|
|
47
|
+
const result = await db.query.users.findMany({
|
|
48
|
+
with: {
|
|
49
|
+
posts: true
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Generated migration:
|
|
55
|
+
```sql
|
|
56
|
+
CREATE TABLE IF NOT EXISTS "countries" (
|
|
57
|
+
"id" serial PRIMARY KEY NOT NULL,
|
|
58
|
+
"name" varchar(256)
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
CREATE TABLE IF NOT EXISTS "cities" (
|
|
62
|
+
"id" serial PRIMARY KEY NOT NULL,
|
|
63
|
+
"name" varchar(256),
|
|
64
|
+
"country_id" integer
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
ALTER TABLE "cities" ADD CONSTRAINT "cities_country_id_countries_id_fk"
|
|
68
|
+
FOREIGN KEY ("country_id") REFERENCES "countries"("id");
|
|
69
|
+
```
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
## PostgreSQL Setup
|
|
2
|
+
|
|
3
|
+
Drizzle supports PostgreSQL via two drivers: `node-postgres` (pg) and `postgres.js`.
|
|
4
|
+
|
|
5
|
+
### Driver Differences
|
|
6
|
+
- **node-postgres**: Can install `pg-native` for ~10% speed boost; supports per-query type parsers without global patching
|
|
7
|
+
- **postgres.js**: Uses prepared statements by default (may need to opt out in AWS environments)
|
|
8
|
+
|
|
9
|
+
### node-postgres Setup
|
|
10
|
+
|
|
11
|
+
Install packages:
|
|
12
|
+
```
|
|
13
|
+
drizzle-orm pg
|
|
14
|
+
-D drizzle-kit @types/pg
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Initialize with connection string:
|
|
18
|
+
```typescript
|
|
19
|
+
import { drizzle } from 'drizzle-orm/node-postgres';
|
|
20
|
+
const db = drizzle(process.env.DATABASE_URL);
|
|
21
|
+
const result = await db.execute('select 1');
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
With config options:
|
|
25
|
+
```typescript
|
|
26
|
+
const db = drizzle({
|
|
27
|
+
connection: {
|
|
28
|
+
connectionString: process.env.DATABASE_URL,
|
|
29
|
+
ssl: true
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
With existing Pool:
|
|
35
|
+
```typescript
|
|
36
|
+
import { Pool } from "pg";
|
|
37
|
+
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
|
|
38
|
+
const db = drizzle({ client: pool });
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### postgres.js Setup
|
|
42
|
+
|
|
43
|
+
Install packages:
|
|
44
|
+
```
|
|
45
|
+
drizzle-orm postgres
|
|
46
|
+
-D drizzle-kit
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Initialize with connection string:
|
|
50
|
+
```typescript
|
|
51
|
+
import { drizzle } from 'drizzle-orm/postgres-js';
|
|
52
|
+
const db = drizzle(process.env.DATABASE_URL);
|
|
53
|
+
const result = await db.execute('select 1');
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
With config options:
|
|
57
|
+
```typescript
|
|
58
|
+
const db = drizzle({
|
|
59
|
+
connection: {
|
|
60
|
+
url: process.env.DATABASE_URL,
|
|
61
|
+
ssl: true
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
With existing client:
|
|
67
|
+
```typescript
|
|
68
|
+
import postgres from 'postgres';
|
|
69
|
+
const queryClient = postgres(process.env.DATABASE_URL);
|
|
70
|
+
const db = drizzle({ client: queryClient });
|
|
71
|
+
```
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
## pg_vector
|
|
2
|
+
|
|
3
|
+
Vector similarity search extension for PostgreSQL. Store vectors alongside relational data with support for exact and approximate nearest neighbor search, multiple vector types (single-precision, half-precision, binary, sparse), and distance metrics (L2, inner product, cosine, L1, Hamming, Jaccard).
|
|
4
|
+
|
|
5
|
+
**Column Types:**
|
|
6
|
+
```ts
|
|
7
|
+
const table = pgTable('table', {
|
|
8
|
+
embedding: vector({ dimensions: 3 })
|
|
9
|
+
})
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
**Indexes:**
|
|
13
|
+
```ts
|
|
14
|
+
const table = pgTable('items', {
|
|
15
|
+
embedding: vector({ dimensions: 3 })
|
|
16
|
+
}, (table) => [
|
|
17
|
+
index('l2_index').using('hnsw', table.embedding.op('vector_l2_ops')),
|
|
18
|
+
index('ip_index').using('hnsw', table.embedding.op('vector_ip_ops')),
|
|
19
|
+
index('cosine_index').using('hnsw', table.embedding.op('vector_cosine_ops')),
|
|
20
|
+
index('l1_index').using('hnsw', table.embedding.op('vector_l1_ops')),
|
|
21
|
+
index('hamming_index').using('hnsw', table.embedding.op('bit_hamming_ops')),
|
|
22
|
+
index('jaccard_index').using('hnsw', table.embedding.op('bit_jaccard_ops'))
|
|
23
|
+
])
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Helper Functions:**
|
|
27
|
+
```ts
|
|
28
|
+
import { l2Distance, l1Distance, innerProduct, cosineDistance, hammingDistance, jaccardDistance } from 'drizzle-orm'
|
|
29
|
+
|
|
30
|
+
l2Distance(table.column, [3, 1, 2]) // <->
|
|
31
|
+
l1Distance(table.column, [3, 1, 2]) // <+>
|
|
32
|
+
innerProduct(table.column, [3, 1, 2]) // <#>
|
|
33
|
+
cosineDistance(table.column, [3, 1, 2]) // <=>
|
|
34
|
+
hammingDistance(table.column, '101') // <~>
|
|
35
|
+
jaccardDistance(table.column, '101') // <%>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Custom distance functions can be created by replicating the pattern:
|
|
39
|
+
```ts
|
|
40
|
+
export function l2Distance(
|
|
41
|
+
column: SQLWrapper | AnyColumn,
|
|
42
|
+
value: number[] | string[] | TypedQueryBuilder<any> | string,
|
|
43
|
+
): SQL {
|
|
44
|
+
if (is(value, TypedQueryBuilder<any>) || typeof value === 'string') {
|
|
45
|
+
return sql`${column} <-> ${value}`;
|
|
46
|
+
}
|
|
47
|
+
return sql`${column} <-> ${JSON.stringify(value)}`;
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Query Examples:**
|
|
52
|
+
```ts
|
|
53
|
+
// Nearest neighbors
|
|
54
|
+
db.select().from(items).orderBy(l2Distance(items.embedding, [3,1,2])).limit(5)
|
|
55
|
+
|
|
56
|
+
// Distance calculation
|
|
57
|
+
db.select({ distance: l2Distance(items.embedding, [3,1,2]) }).from(items)
|
|
58
|
+
|
|
59
|
+
// Subquery distance
|
|
60
|
+
const subquery = db.select({ embedding: items.embedding }).from(items).where(eq(items.id, 1));
|
|
61
|
+
db.select().from(items).orderBy(l2Distance(items.embedding, subquery)).limit(5)
|
|
62
|
+
|
|
63
|
+
// Computed distance
|
|
64
|
+
db.select({ innerProduct: sql`(${innerProduct(items.embedding, [3,1,2])}) * -1` }).from(items)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## PostGIS
|
|
68
|
+
|
|
69
|
+
Geospatial extension for PostgreSQL. Adds support for storing, indexing, and querying geographic data.
|
|
70
|
+
|
|
71
|
+
**Column Types:**
|
|
72
|
+
```ts
|
|
73
|
+
const items = pgTable('items', {
|
|
74
|
+
geo: geometry('geo', { type: 'point' }),
|
|
75
|
+
geoObj: geometry('geo_obj', { type: 'point', mode: 'xy' }),
|
|
76
|
+
geoSrid: geometry('geo_options', { type: 'point', mode: 'xy', srid: 4000 }),
|
|
77
|
+
});
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Mode:** `tuple` (default, maps to [x,y]) or `xy` (maps to {x, y} object)
|
|
81
|
+
|
|
82
|
+
**Type:** Predefined `point` type available; any string can be used for other PostGIS types
|
|
83
|
+
|
|
84
|
+
**Indexes:**
|
|
85
|
+
```ts
|
|
86
|
+
const table = pgTable('table', {
|
|
87
|
+
geo: geometry({ type: 'point' }),
|
|
88
|
+
}, (table) => [
|
|
89
|
+
index('custom_idx').using('gist', table.geo)
|
|
90
|
+
])
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Note: Use `extensionsFilters` in drizzle config to exclude PostGIS tables from introspect/push commands.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
## Query Performance with Prepared Statements
|
|
2
|
+
|
|
3
|
+
Drizzle ORM is a thin TypeScript layer on top of SQL with minimal overhead. To achieve near-zero overhead, use prepared statements.
|
|
4
|
+
|
|
5
|
+
### How Query Execution Works
|
|
6
|
+
When running a query:
|
|
7
|
+
1. Query builder configurations are concatenated into an SQL string
|
|
8
|
+
2. String and parameters are sent to the database driver
|
|
9
|
+
3. Driver compiles SQL to binary executable format and sends to database
|
|
10
|
+
|
|
11
|
+
With prepared statements, SQL concatenation happens once on the Drizzle side, allowing the database driver to reuse the precompiled binary SQL instead of parsing the query repeatedly. This provides extreme performance benefits, especially for large SQL queries.
|
|
12
|
+
|
|
13
|
+
Different database drivers support prepared statements differently. Drizzle ORM can sometimes outperform even the better-sqlite3 driver.
|
|
14
|
+
|
|
15
|
+
### Prepared Statement Usage
|
|
16
|
+
|
|
17
|
+
**PostgreSQL:**
|
|
18
|
+
```typescript
|
|
19
|
+
const db = drizzle(...);
|
|
20
|
+
const prepared = db.select().from(customers).prepare("statement_name");
|
|
21
|
+
const res1 = await prepared.execute();
|
|
22
|
+
const res2 = await prepared.execute();
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**MySQL:**
|
|
26
|
+
```typescript
|
|
27
|
+
const prepared = db.select().from(customers).prepare();
|
|
28
|
+
const res1 = await prepared.execute();
|
|
29
|
+
const res2 = await prepared.execute();
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**SQLite:**
|
|
33
|
+
```typescript
|
|
34
|
+
const prepared = db.select().from(customers).prepare();
|
|
35
|
+
const res1 = prepared.all();
|
|
36
|
+
const res2 = prepared.all();
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**SingleStore:**
|
|
40
|
+
```typescript
|
|
41
|
+
const prepared = db.select().from(customers).prepare();
|
|
42
|
+
const res1 = await prepared.execute();
|
|
43
|
+
const res2 = await prepared.execute();
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Placeholders for Dynamic Values
|
|
47
|
+
|
|
48
|
+
Use `sql.placeholder(...)` to embed dynamic runtime values:
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
import { sql } from "drizzle-orm";
|
|
52
|
+
|
|
53
|
+
// Simple placeholder
|
|
54
|
+
const p1 = db
|
|
55
|
+
.select()
|
|
56
|
+
.from(customers)
|
|
57
|
+
.where(eq(customers.id, sql.placeholder('id')))
|
|
58
|
+
.prepare("p1");
|
|
59
|
+
|
|
60
|
+
await p1.execute({ id: 10 }); // SELECT * FROM customers WHERE id = 10
|
|
61
|
+
await p1.execute({ id: 12 }); // SELECT * FROM customers WHERE id = 12
|
|
62
|
+
|
|
63
|
+
// Complex placeholder with SQL functions
|
|
64
|
+
const p2 = db
|
|
65
|
+
.select()
|
|
66
|
+
.from(customers)
|
|
67
|
+
.where(sql`lower(${customers.name}) like ${sql.placeholder('name')}`)
|
|
68
|
+
.prepare("p2");
|
|
69
|
+
|
|
70
|
+
await p2.execute({ name: '%an%' }); // SELECT * FROM customers WHERE lower(name) like '%an%'
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
For SQLite, use `.get()` and `.all()` instead of `.execute()`:
|
|
74
|
+
```typescript
|
|
75
|
+
p1.get({ id: 10 });
|
|
76
|
+
p2.all({ name: '%an%' });
|
|
77
|
+
```
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
## Drizzle Extension for Prisma
|
|
2
|
+
|
|
3
|
+
Allows using Drizzle alongside Prisma in existing projects by extending the Prisma client with Drizzle API, reusing the same DB connection.
|
|
4
|
+
|
|
5
|
+
### Setup
|
|
6
|
+
|
|
7
|
+
1. Install dependencies:
|
|
8
|
+
```bash
|
|
9
|
+
npm install drizzle-orm
|
|
10
|
+
npm install -D drizzle-prisma-generator
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
2. Add generator to `schema.prisma`:
|
|
14
|
+
```prisma
|
|
15
|
+
generator drizzle {
|
|
16
|
+
provider = "drizzle-prisma-generator"
|
|
17
|
+
output = "./drizzle"
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
3. Generate schema:
|
|
22
|
+
```bash
|
|
23
|
+
prisma generate
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
4. Extend Prisma client (PostgreSQL example; also available for MySQL and SQLite):
|
|
27
|
+
```ts
|
|
28
|
+
import { PrismaClient } from '@prisma/client';
|
|
29
|
+
import { drizzle } from 'drizzle-orm/prisma/pg';
|
|
30
|
+
|
|
31
|
+
const prisma = new PrismaClient().$extends(drizzle());
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
5. Use Drizzle queries via `prisma.$drizzle`:
|
|
35
|
+
```ts
|
|
36
|
+
import { User } from './drizzle';
|
|
37
|
+
|
|
38
|
+
await prisma.$drizzle.insert().into(User).values({ email: 'sorenbs@drizzle.team', name: 'Søren' });
|
|
39
|
+
const users = await prisma.$drizzle.select().from(User);
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Limitations
|
|
43
|
+
|
|
44
|
+
- Relational queries not supported (Prisma driver limitation with array format results)
|
|
45
|
+
- SQLite: `.values()` not supported
|
|
46
|
+
- Prepared statements: `.prepare()` builds SQL on Drizzle side only, no Prisma API for prepared queries
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
## Purpose
|
|
2
|
+
`drizzle-kit pull` introspects an existing database schema and generates a TypeScript Drizzle schema file (`schema.ts`). It's designed for database-first migration approaches where the database schema is managed outside the TypeScript project.
|
|
3
|
+
|
|
4
|
+
## How It Works
|
|
5
|
+
1. Pulls database schema (DDL) from an existing database
|
|
6
|
+
2. Generates `schema.ts` file with Drizzle schema definitions
|
|
7
|
+
3. Saves output to the `out` folder (default: `./drizzle`)
|
|
8
|
+
|
|
9
|
+
Example flow:
|
|
10
|
+
```
|
|
11
|
+
Database: CREATE TABLE "users" ("id" SERIAL PRIMARY KEY, "name" TEXT, "email" TEXT UNIQUE);
|
|
12
|
+
↓
|
|
13
|
+
Generated schema.ts:
|
|
14
|
+
import * as p from "drizzle-orm/pg-core";
|
|
15
|
+
export const users = p.pgTable("users", {
|
|
16
|
+
id: p.serial().primaryKey(),
|
|
17
|
+
name: p.text(),
|
|
18
|
+
email: p.text().unique(),
|
|
19
|
+
});
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Configuration
|
|
23
|
+
Requires `dialect` and database connection info via config file or CLI:
|
|
24
|
+
|
|
25
|
+
**Config file approach:**
|
|
26
|
+
```ts
|
|
27
|
+
// drizzle.config.ts
|
|
28
|
+
import { defineConfig } from "drizzle-kit";
|
|
29
|
+
export default defineConfig({
|
|
30
|
+
dialect: "postgresql",
|
|
31
|
+
dbCredentials: {
|
|
32
|
+
url: "postgresql://user:password@host:port/dbname",
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
```
|
|
36
|
+
```shell
|
|
37
|
+
npx drizzle-kit pull
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**CLI approach:**
|
|
41
|
+
```shell
|
|
42
|
+
npx drizzle-kit pull --dialect=postgresql --url=postgresql://user:password@host:port/dbname
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Multiple Config Files
|
|
46
|
+
Support for multiple configuration files in one project for different database stages:
|
|
47
|
+
```shell
|
|
48
|
+
npx drizzle-kit pull --config=drizzle-dev.config.ts
|
|
49
|
+
npx drizzle-kit pull --config=drizzle-prod.config.ts
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Database Driver Specification
|
|
53
|
+
Drizzle Kit automatically picks the database driver based on `dialect`. For exceptions like AWS Data API, PGLite, and Cloudflare D1 HTTP, explicitly specify the `driver` param:
|
|
54
|
+
|
|
55
|
+
```ts
|
|
56
|
+
// AWS Data API
|
|
57
|
+
export default defineConfig({
|
|
58
|
+
dialect: "postgresql",
|
|
59
|
+
driver: "aws-data-api",
|
|
60
|
+
dbCredentials: {
|
|
61
|
+
database: "database",
|
|
62
|
+
resourceArn: "resourceArn",
|
|
63
|
+
secretArn: "secretArn",
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// PGLite
|
|
68
|
+
export default defineConfig({
|
|
69
|
+
dialect: "postgresql",
|
|
70
|
+
driver: "pglite",
|
|
71
|
+
dbCredentials: {
|
|
72
|
+
url: ":memory:" // or "./database/"
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// Cloudflare D1 HTTP
|
|
77
|
+
export default defineConfig({
|
|
78
|
+
dialect: "sqlite",
|
|
79
|
+
driver: "d1-http",
|
|
80
|
+
dbCredentials: {
|
|
81
|
+
accountId: "accountId",
|
|
82
|
+
databaseId: "databaseId",
|
|
83
|
+
token: "token",
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Note: Expo SQLite and OP SQLite cannot be used with `pull` as they are on-device databases.
|
|
89
|
+
|
|
90
|
+
## Filtering Tables, Schemas, and Extensions
|
|
91
|
+
Configure which tables, schemas, and extensions to manage:
|
|
92
|
+
|
|
93
|
+
```ts
|
|
94
|
+
export default defineConfig({
|
|
95
|
+
dialect: "postgresql",
|
|
96
|
+
schema: "./src/schema.ts",
|
|
97
|
+
dbCredentials: {
|
|
98
|
+
url: "postgresql://user:password@host:port/dbname",
|
|
99
|
+
},
|
|
100
|
+
extensionsFilters: ["postgis"],
|
|
101
|
+
schemaFilter: ["public"],
|
|
102
|
+
tablesFilter: ["*"],
|
|
103
|
+
});
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
| Option | Description |
|
|
107
|
+
|--------|-------------|
|
|
108
|
+
| `tablesFilter` | Glob-based table names filter, e.g. `["users", "user_info"]` or `"user*"`. Default: `"*"` |
|
|
109
|
+
| `schemaFilter` | Schema names filter, e.g. `["public", "drizzle"]`. Default: `["public"]` |
|
|
110
|
+
| `extensionsFilters` | List of installed database extensions, e.g. `["postgis"]`. Default: `[]` |
|
|
111
|
+
|
|
112
|
+
## CLI Options
|
|
113
|
+
```shell
|
|
114
|
+
npx drizzle-kit pull --dialect=postgresql --url=postgresql://user:password@host:port/dbname
|
|
115
|
+
npx drizzle-kit pull --dialect=postgresql --driver=pglite --url=database/
|
|
116
|
+
npx drizzle-kit pull --dialect=postgresql --tablesFilter='user*' --extensionsFilters=postgis --url=postgresql://user:password@host:port/dbname
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
| Option | Required | Description |
|
|
120
|
+
|--------|----------|-------------|
|
|
121
|
+
| `dialect` | Yes | Database dialect (postgresql, mysql, sqlite, etc.) |
|
|
122
|
+
| `driver` | No | Driver exceptions (aws-data-api, pglite, d1-http) |
|
|
123
|
+
| `out` | No | Migrations output folder path, default: `./drizzle` |
|
|
124
|
+
| `url` | No | Database connection string |
|
|
125
|
+
| `user` | No | Database user |
|
|
126
|
+
| `password` | No | Database password |
|
|
127
|
+
| `host` | No | Host |
|
|
128
|
+
| `port` | No | Port |
|
|
129
|
+
| `database` | No | Database name |
|
|
130
|
+
| `config` | No | Configuration file path, default: `drizzle.config.ts` |
|
|
131
|
+
| `introspect-casing` | No | Strategy for JS keys creation: `preserve` or `camel` |
|
|
132
|
+
| `tablesFilter` | No | Table name filter |
|
|
133
|
+
| `schemaFilter` | No | Schema name filter, default: `["public"]` |
|
|
134
|
+
| `extensionsFilters` | No | Database extensions internal database filters |
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
## Overview
|
|
2
|
+
`drizzle-kit push` applies schema changes directly to the database without generating SQL files. It implements a code-first migration approach by reading your Drizzle schema, comparing it to the database schema, generating SQL migrations, and applying them automatically.
|
|
3
|
+
|
|
4
|
+
## How It Works
|
|
5
|
+
1. Read Drizzle schema file(s) and create a JSON snapshot
|
|
6
|
+
2. Introspect current database schema
|
|
7
|
+
3. Generate SQL migrations based on differences
|
|
8
|
+
4. Apply migrations to the database
|
|
9
|
+
|
|
10
|
+
## Configuration
|
|
11
|
+
Configure via `drizzle.config.ts` or CLI options. Required: `dialect`, `schema` path, and database connection (`url` or `user:password@host:port/db`).
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
// drizzle.config.ts
|
|
15
|
+
import { defineConfig } from "drizzle-kit";
|
|
16
|
+
|
|
17
|
+
export default defineConfig({
|
|
18
|
+
dialect: "postgresql",
|
|
19
|
+
schema: "./src/schema.ts",
|
|
20
|
+
dbCredentials: {
|
|
21
|
+
url: "postgresql://user:password@host:port/dbname",
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
```shell
|
|
27
|
+
npx drizzle-kit push
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Or via CLI:
|
|
31
|
+
```shell
|
|
32
|
+
npx drizzle-kit push --dialect=postgresql --schema=./src/schema.ts --url=postgresql://user:password@host:port/dbname
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Schema Files
|
|
36
|
+
Use glob patterns for single or multiple schema files:
|
|
37
|
+
```ts
|
|
38
|
+
schema: "./src/schema.ts" // single file
|
|
39
|
+
schema: "./src/**/*.schema.ts" // multiple files
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Multiple Config Files
|
|
43
|
+
Support different database stages or databases:
|
|
44
|
+
```shell
|
|
45
|
+
npx drizzle-kit push --config=drizzle-dev.config.ts
|
|
46
|
+
npx drizzle-kit push --config=drizzle-prod.config.ts
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Database Drivers
|
|
50
|
+
Drizzle Kit automatically picks the driver based on `dialect`. For exceptions like `aws-data-api`, `pglight`, and `d1-http`, explicitly specify the `driver` parameter.
|
|
51
|
+
|
|
52
|
+
Note: Expo SQLite and OP SQLite (on-device databases) don't support `push`; use embedded migrations instead.
|
|
53
|
+
|
|
54
|
+
## Filtering Tables, Schemas, and Extensions
|
|
55
|
+
```ts
|
|
56
|
+
export default defineConfig({
|
|
57
|
+
dialect: "postgresql",
|
|
58
|
+
schema: "./src/schema.ts",
|
|
59
|
+
dbCredentials: { url: "..." },
|
|
60
|
+
tablesFilter: ["*"], // glob-based table filter, default "*"
|
|
61
|
+
schemaFilter: ["public"], // schema names, default ["public"]
|
|
62
|
+
extensionsFilters: ["postgis"], // installed extensions to ignore
|
|
63
|
+
});
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## CLI-Only Options
|
|
67
|
+
- `--verbose`: Print all SQL statements before execution
|
|
68
|
+
- `--strict`: Ask for approval before executing SQL
|
|
69
|
+
- `--force`: Auto-accept data-loss statements
|
|
70
|
+
|
|
71
|
+
```shell
|
|
72
|
+
npx drizzle-kit push --strict --verbose --force
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## All Configuration Options
|
|
76
|
+
| Option | Required | Description |
|
|
77
|
+
|--------|----------|-------------|
|
|
78
|
+
| `dialect` | yes | Database dialect (postgresql, mysql, sqlite, etc.) |
|
|
79
|
+
| `schema` | yes | Path to schema file(s) or folder |
|
|
80
|
+
| `driver` | | Driver exception (aws-data-api, pglight, d1-http) |
|
|
81
|
+
| `tablesFilter` | | Table name filter |
|
|
82
|
+
| `schemaFilter` | | Schema names, default `["public"]` |
|
|
83
|
+
| `extensionsFilters` | | Database extensions to ignore |
|
|
84
|
+
| `url` | | Database connection string |
|
|
85
|
+
| `user` | | Database user |
|
|
86
|
+
| `password` | | Database password |
|
|
87
|
+
| `host` | | Host |
|
|
88
|
+
| `port` | | Port |
|
|
89
|
+
| `database` | | Database name |
|
|
90
|
+
| `config` | | Config file path, default `drizzle.config.ts` |
|
|
91
|
+
|
|
92
|
+
## Example
|
|
93
|
+
```ts
|
|
94
|
+
// drizzle.config.ts
|
|
95
|
+
import { defineConfig } from "drizzle-kit";
|
|
96
|
+
|
|
97
|
+
export default defineConfig({
|
|
98
|
+
dialect: "postgresql",
|
|
99
|
+
schema: "./src/schema.ts",
|
|
100
|
+
dbCredentials: {
|
|
101
|
+
url: "postgresql://user:password@host:port/dbname"
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
```ts
|
|
107
|
+
// src/schema.ts
|
|
108
|
+
import * as p from "drizzle-orm/pg-core";
|
|
109
|
+
|
|
110
|
+
export const users = p.pgTable("users", {
|
|
111
|
+
id: p.serial().primaryKey(),
|
|
112
|
+
name: p.text(),
|
|
113
|
+
})
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
```shell
|
|
117
|
+
npx drizzle-kit push
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Generates and applies:
|
|
121
|
+
```sql
|
|
122
|
+
CREATE TABLE "users"(
|
|
123
|
+
id serial primary key,
|
|
124
|
+
name text
|
|
125
|
+
)
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Use Cases
|
|
129
|
+
Best for rapid prototyping and production applications. Pairs well with blue/green deployments and serverless databases (Planetscale, Neon, Turso).
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
## SQL-like Syntax
|
|
2
|
+
|
|
3
|
+
Drizzle provides SQL-like query syntax that mirrors standard SQL, minimizing learning curve. You write queries that look like SQL and know exactly what SQL will be generated.
|
|
4
|
+
|
|
5
|
+
**Select with joins:**
|
|
6
|
+
```typescript
|
|
7
|
+
await db
|
|
8
|
+
.select()
|
|
9
|
+
.from(posts)
|
|
10
|
+
.leftJoin(comments, eq(posts.id, comments.post_id))
|
|
11
|
+
.where(eq(posts.id, 10))
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
**Insert:**
|
|
15
|
+
```typescript
|
|
16
|
+
await db.insert(users).values({ email: 'user@gmail.com' })
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**Update:**
|
|
20
|
+
```typescript
|
|
21
|
+
await db.update(users)
|
|
22
|
+
.set({ email: 'user@gmail.com' })
|
|
23
|
+
.where(eq(users.id, 1))
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Delete:**
|
|
27
|
+
```typescript
|
|
28
|
+
await db.delete(users).where(eq(users.id, 1))
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Supports select, insert, update, delete, aliases, WITH clauses, subqueries, and prepared statements.
|
|
32
|
+
|
|
33
|
+
## Relational Queries API
|
|
34
|
+
|
|
35
|
+
For common scenarios with nested/relational data, use the Queries API for more convenient and performant fetching without manual joins or data mapping. Always outputs exactly one SQL query, safe for serverless databases.
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
const result = await db.query.users.findMany({
|
|
39
|
+
with: {
|
|
40
|
+
posts: true
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Advanced Composition
|
|
46
|
+
|
|
47
|
+
Queries can be composed and partitioned flexibly:
|
|
48
|
+
|
|
49
|
+
**Compose WHERE filters independently:**
|
|
50
|
+
```typescript
|
|
51
|
+
async function getProductsBy({ name, category, maxPrice }) {
|
|
52
|
+
const filters: SQL[] = [];
|
|
53
|
+
if (name) filters.push(ilike(products.name, name));
|
|
54
|
+
if (category) filters.push(eq(products.category, category));
|
|
55
|
+
if (maxPrice) filters.push(lte(products.price, maxPrice));
|
|
56
|
+
return db.select().from(products).where(and(...filters));
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**Separate subqueries into variables:**
|
|
61
|
+
```typescript
|
|
62
|
+
const subquery = db
|
|
63
|
+
.select()
|
|
64
|
+
.from(internalStaff)
|
|
65
|
+
.leftJoin(customUser, eq(internalStaff.userId, customUser.id))
|
|
66
|
+
.as('internal_staff');
|
|
67
|
+
|
|
68
|
+
const mainQuery = await db
|
|
69
|
+
.select()
|
|
70
|
+
.from(ticket)
|
|
71
|
+
.leftJoin(subquery, eq(subquery.internal_staff.userId, ticket.staffId));
|
|
72
|
+
```
|