@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,79 @@
|
|
|
1
|
+
## SQL Update
|
|
2
|
+
|
|
3
|
+
Basic update with `.set()` and `.where()`:
|
|
4
|
+
```typescript
|
|
5
|
+
await db.update(users)
|
|
6
|
+
.set({ name: 'Mr. Dan' })
|
|
7
|
+
.where(eq(users.name, 'Dan'));
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
Keys in the set object must match column names. `undefined` values are ignored; pass `null` to set a column to null. SQL expressions can be passed as values:
|
|
11
|
+
```typescript
|
|
12
|
+
await db.update(users)
|
|
13
|
+
.set({ updatedAt: sql`NOW()` })
|
|
14
|
+
.where(eq(users.name, 'Dan'));
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### Limit (MySQL, SQLite, SingleStore only)
|
|
18
|
+
```typescript
|
|
19
|
+
await db.update(usersTable).set({ verified: true }).limit(2);
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### Order By
|
|
23
|
+
```typescript
|
|
24
|
+
import { asc, desc } from 'drizzle-orm';
|
|
25
|
+
|
|
26
|
+
await db.update(usersTable).set({ verified: true }).orderBy(usersTable.name);
|
|
27
|
+
await db.update(usersTable).set({ verified: true }).orderBy(desc(usersTable.name));
|
|
28
|
+
await db.update(usersTable).set({ verified: true }).orderBy(usersTable.name, usersTable.name2);
|
|
29
|
+
await db.update(usersTable).set({ verified: true }).orderBy(asc(usersTable.name), desc(usersTable.name2));
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Returning (PostgreSQL, SQLite only)
|
|
33
|
+
```typescript
|
|
34
|
+
const updatedUserId: { updatedId: number }[] = await db.update(users)
|
|
35
|
+
.set({ name: 'Mr. Dan' })
|
|
36
|
+
.where(eq(users.name, 'Dan'))
|
|
37
|
+
.returning({ updatedId: users.id });
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### WITH clause (CTE)
|
|
41
|
+
```typescript
|
|
42
|
+
const averagePrice = db.$with('average_price').as(
|
|
43
|
+
db.select({ value: sql`avg(${products.price})`.as('value') }).from(products)
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
const result = await db.with(averagePrice)
|
|
47
|
+
.update(products)
|
|
48
|
+
.set({ cheap: true })
|
|
49
|
+
.where(lt(products.price, sql`(select * from ${averagePrice})`))
|
|
50
|
+
.returning({ id: products.id });
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Update ... FROM (PostgreSQL, SQLite only)
|
|
54
|
+
Join other tables to compute which rows to update and their new values:
|
|
55
|
+
```typescript
|
|
56
|
+
await db
|
|
57
|
+
.update(users)
|
|
58
|
+
.set({ cityId: cities.id })
|
|
59
|
+
.from(cities)
|
|
60
|
+
.where(and(eq(cities.name, 'Seattle'), eq(users.name, 'John')));
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
With table aliases:
|
|
64
|
+
```typescript
|
|
65
|
+
const c = alias(cities, 'c');
|
|
66
|
+
await db
|
|
67
|
+
.update(users)
|
|
68
|
+
.set({ cityId: c.id })
|
|
69
|
+
.from(c);
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
PostgreSQL only: return columns from joined tables:
|
|
73
|
+
```typescript
|
|
74
|
+
const updatedUsers = await db
|
|
75
|
+
.update(users)
|
|
76
|
+
.set({ cityId: cities.id })
|
|
77
|
+
.from(cities)
|
|
78
|
+
.returning({ id: users.id, cityName: cities.name });
|
|
79
|
+
```
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
## Breaking Changes
|
|
2
|
+
|
|
3
|
+
**Dialect prefix removal**: Remove `:dialect` from drizzle-kit commands. Change `drizzle-kit push:mysql` to `drizzle-kit push`.
|
|
4
|
+
|
|
5
|
+
**drizzle.config.ts updates**:
|
|
6
|
+
- `dialect` is now mandatory: `"postgresql"`, `"mysql"`, or `"sqlite"`
|
|
7
|
+
- `driver` is optional, only use if: `aws-data-api`, `turso`, `d1-http` (WIP), or `expo`
|
|
8
|
+
- Replace `connectionString` or `uri` with `url` in `dbCredentials`
|
|
9
|
+
- New `migrations` object for custom table/schema:
|
|
10
|
+
```ts
|
|
11
|
+
import { defineConfig } from "drizzle-kit"
|
|
12
|
+
export default defineConfig({
|
|
13
|
+
dialect: "sqlite",
|
|
14
|
+
driver: "turso",
|
|
15
|
+
dbCredentials: { url: "" },
|
|
16
|
+
migrations: { table: "migrations", schema: "public" }
|
|
17
|
+
})
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Snapshot upgrade**: PostgreSQL and SQLite snapshots upgrade to version 6. Run `drizzle-kit up` to upgrade.
|
|
21
|
+
|
|
22
|
+
**Driver auto-selection** (when no driver specified):
|
|
23
|
+
- PostgreSQL: tries `pg` → `postgres` → `@vercel/postgres` → `@neondatabase/serverless`
|
|
24
|
+
- MySQL: tries `mysql2` → `@planetscale/database`
|
|
25
|
+
- SQLite: tries `@libsql/client` → `better-sqlite3`
|
|
26
|
+
|
|
27
|
+
**MySQL schemas removed**: Drizzle Kit no longer handles schema changes for additional schemas/databases.
|
|
28
|
+
|
|
29
|
+
## New Features
|
|
30
|
+
|
|
31
|
+
**Pull relations**: Drizzle extracts foreign key information and generates `relations.ts` during introspection.
|
|
32
|
+
|
|
33
|
+
**Custom migration names**: Use `drizzle-kit generate --name init_db`
|
|
34
|
+
|
|
35
|
+
**New migrate command**: `drizzle-kit migrate` applies generated migrations directly. By default stores in `__drizzle_migrations` table (PostgreSQL: `drizzle` schema). Customize via `drizzle.config.ts`:
|
|
36
|
+
```ts
|
|
37
|
+
export default defineConfig({
|
|
38
|
+
migrations: { table: "migrations", schema: "public" }
|
|
39
|
+
})
|
|
40
|
+
```
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
## Overview
|
|
2
|
+
`drizzle-valibot` is a plugin for Drizzle ORM that generates Valibot schemas from Drizzle ORM table definitions. Requires `drizzle-valibot@0.3.0+`, Drizzle ORM v0.36.0+, and Valibot v1.0.0-beta.7+.
|
|
3
|
+
|
|
4
|
+
## Select Schema
|
|
5
|
+
Validates data queried from the database (useful for API responses).
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import { pgTable, text, integer } from 'drizzle-orm/pg-core';
|
|
9
|
+
import { createSelectSchema } from 'drizzle-valibot';
|
|
10
|
+
import { parse } from 'valibot';
|
|
11
|
+
|
|
12
|
+
const users = pgTable('users', {
|
|
13
|
+
id: integer().generatedAlwaysAsIdentity().primaryKey(),
|
|
14
|
+
name: text().notNull(),
|
|
15
|
+
age: integer().notNull()
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
const userSelectSchema = createSelectSchema(users);
|
|
19
|
+
const rows = await db.select().from(users).limit(1);
|
|
20
|
+
const parsed = parse(userSelectSchema, rows[0]); // { id: number; name: string; age: number }
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Works with views and enums:
|
|
24
|
+
```ts
|
|
25
|
+
const roles = pgEnum('roles', ['admin', 'basic']);
|
|
26
|
+
const rolesSchema = createSelectSchema(roles);
|
|
27
|
+
const parsed = parse(rolesSchema, ...); // 'admin' | 'basic'
|
|
28
|
+
|
|
29
|
+
const usersView = pgView('users_view').as((qb) => qb.select().from(users).where(gt(users.age, 18)));
|
|
30
|
+
const usersViewSchema = createSelectSchema(usersView);
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Insert Schema
|
|
34
|
+
Validates data before inserting into the database (useful for API requests). Auto-generated columns are excluded.
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
const userInsertSchema = createInsertSchema(users);
|
|
38
|
+
const user = { name: 'Jane', age: 30 };
|
|
39
|
+
const parsed = parse(userInsertSchema, user); // { name: string, age: number }
|
|
40
|
+
await db.insert(users).values(parsed);
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Update Schema
|
|
44
|
+
Validates data before updating in the database. All fields become optional, and generated columns cannot be updated.
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
const userUpdateSchema = createUpdateSchema(users);
|
|
48
|
+
const user = { age: 35 };
|
|
49
|
+
const parsed = parse(userUpdateSchema, user); // { name?: string | undefined, age?: number | undefined }
|
|
50
|
+
await db.update(users).set(parsed).where(eq(users.name, 'Jane'));
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Refinements
|
|
54
|
+
All `createSelectSchema`, `createInsertSchema`, and `createUpdateSchema` functions accept an optional second parameter to extend, modify, or overwrite field schemas. Pass a callback function to extend/modify, or a Valibot schema to overwrite.
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
const userSelectSchema = createSelectSchema(users, {
|
|
58
|
+
name: (schema) => pipe(schema, maxLength(20)), // Extends schema
|
|
59
|
+
bio: (schema) => pipe(schema, maxLength(1000)), // Extends before nullability
|
|
60
|
+
preferences: object({ theme: string() }) // Overwrites field including nullability
|
|
61
|
+
});
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Data Type Reference
|
|
65
|
+
Maps Drizzle ORM column types to Valibot schemas:
|
|
66
|
+
|
|
67
|
+
**Boolean**: `pg.boolean()` → `boolean()`
|
|
68
|
+
|
|
69
|
+
**Date**: `pg.date({ mode: 'date' })`, `pg.timestamp({ mode: 'date' })` → `date()`
|
|
70
|
+
|
|
71
|
+
**String**: `pg.text()`, `pg.varchar()`, `mysql.binary()`, etc. → `string()`
|
|
72
|
+
|
|
73
|
+
**Bit**: `pg.bit({ dimensions: ... })` → `pipe(string(), regex(/^[01]+$/), maxLength(dimensions))`
|
|
74
|
+
|
|
75
|
+
**UUID**: `pg.uuid()` → `pipe(string(), uuid())`
|
|
76
|
+
|
|
77
|
+
**Char**: `pg.char({ length: ... })` → `pipe(string(), length(length))`
|
|
78
|
+
|
|
79
|
+
**Varchar**: `pg.varchar({ length: ... })` → `pipe(string(), maxLength(length))`
|
|
80
|
+
|
|
81
|
+
**MySQL text variants**: `mysql.tinytext()` → `pipe(string(), maxLength(255))`, `mysql.text()` → `maxLength(65_535)`, `mysql.mediumtext()` → `maxLength(16_777_215)`, `mysql.longtext()` → `maxLength(4_294_967_295)`
|
|
82
|
+
|
|
83
|
+
**Enum**: `pg.text({ enum: [...] })` → `enum([...])`
|
|
84
|
+
|
|
85
|
+
**Integer types with range validation**:
|
|
86
|
+
- `mysql.tinyint()` → `pipe(number(), minValue(-128), maxValue(127), integer())`
|
|
87
|
+
- `mysql.tinyint({ unsigned: true })` → `pipe(number(), minValue(0), maxValue(255), integer())`
|
|
88
|
+
- `pg.smallint()` → `pipe(number(), minValue(-32_768), maxValue(32_767), integer())`
|
|
89
|
+
- `mysql.smallint({ unsigned: true })` → `pipe(number(), minValue(0), maxValue(65_535), integer())`
|
|
90
|
+
- `pg.real()`, `mysql.float()` → `pipe(number(), minValue(-8_388_608), maxValue(8_388_607))`
|
|
91
|
+
- `mysql.mediumint()` → `pipe(number(), minValue(-8_388_608), maxValue(8_388_607), integer())`
|
|
92
|
+
- `mysql.float({ unsigned: true })` → `pipe(number(), minValue(0), maxValue(16_777_215))`
|
|
93
|
+
- `mysql.mediumint({ unsigned: true })` → `pipe(number(), minValue(0), maxValue(16_777_215), integer())`
|
|
94
|
+
- `pg.integer()`, `mysql.int()` → `pipe(number(), minValue(-2_147_483_648), maxValue(2_147_483_647), integer())`
|
|
95
|
+
- `mysql.int({ unsigned: true })` → `pipe(number(), minValue(0), maxValue(4_294_967_295), integer())`
|
|
96
|
+
- `pg.doublePrecision()`, `mysql.double()` → `pipe(number(), minValue(-140_737_488_355_328), maxValue(140_737_488_355_327))`
|
|
97
|
+
- `mysql.double({ unsigned: true })` → `pipe(number(), minValue(0), maxValue(281_474_976_710_655))`
|
|
98
|
+
- `pg.bigint({ mode: 'number' })` → `pipe(number(), minValue(-9_007_199_254_740_991), maxValue(9_007_199_254_740_991), integer())`
|
|
99
|
+
- `mysql.serial()` → `pipe(number(), minValue(0), maxValue(9_007_199_254_740_991), integer())`
|
|
100
|
+
- `pg.bigint({ mode: 'bigint' })` → `pipe(bigint(), minValue(-9_223_372_036_854_775_808n), maxValue(9_223_372_036_854_775_807n))`
|
|
101
|
+
- `mysql.bigint({ mode: 'bigint', unsigned: true })` → `pipe(bigint(), minValue(0n), maxValue(18_446_744_073_709_551_615n))`
|
|
102
|
+
|
|
103
|
+
**Year**: `mysql.year()` → `pipe(number(), minValue(1_901), maxValue(2_155), integer())`
|
|
104
|
+
|
|
105
|
+
**Geometry**: `pg.point({ mode: 'tuple' })` → `tuple([number(), number()])`, `pg.point({ mode: 'xy' })` → `object({ x: number(), y: number() })`
|
|
106
|
+
|
|
107
|
+
**Vectors**: `pg.vector({ dimensions: ... })` → `pipe(array(number()), length(dimensions))`
|
|
108
|
+
|
|
109
|
+
**Line**: `pg.line({ mode: 'abc' })` → `object({ a: number(), b: number(), c: number() })`, `pg.line({ mode: 'tuple' })` → `tuple([number(), number(), number()])`
|
|
110
|
+
|
|
111
|
+
**JSON**: `pg.json()`, `pg.jsonb()`, `mysql.json()` → `union([union([string(), number(), boolean(), null_()]), array(any()), record(string(), any())])`
|
|
112
|
+
|
|
113
|
+
**Buffer**: `sqlite.blob({ mode: 'buffer' })` → `custom<Buffer>((v) => v instanceof Buffer)`
|
|
114
|
+
|
|
115
|
+
**Arrays**: `pg.dataType().array(...)` → `pipe(array(baseDataTypeSchema), length(size))`
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
## Declaring Views
|
|
2
|
+
|
|
3
|
+
Views can be declared in three ways:
|
|
4
|
+
1. **Inline query builder** - passed directly to `.as()`
|
|
5
|
+
2. **Standalone query builder** - created separately and passed to `.as()`
|
|
6
|
+
3. **Raw SQL** - using `sql` operator with explicit column schema
|
|
7
|
+
|
|
8
|
+
### Basic Declaration (Inline Query Builder)
|
|
9
|
+
|
|
10
|
+
PostgreSQL:
|
|
11
|
+
```ts
|
|
12
|
+
import { pgTable, pgView, serial, text, timestamp } from "drizzle-orm/pg-core";
|
|
13
|
+
|
|
14
|
+
export const user = pgTable("user", {
|
|
15
|
+
id: serial(),
|
|
16
|
+
name: text(),
|
|
17
|
+
email: text(),
|
|
18
|
+
password: text(),
|
|
19
|
+
role: text().$type<"admin" | "customer">(),
|
|
20
|
+
createdAt: timestamp("created_at"),
|
|
21
|
+
updatedAt: timestamp("updated_at"),
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
export const userView = pgView("user_view").as((qb) => qb.select().from(user));
|
|
25
|
+
export const customersView = pgView("customers_view").as((qb) =>
|
|
26
|
+
qb.select().from(user).where(eq(user.role, "customer"))
|
|
27
|
+
);
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
MySQL and SQLite use `mysqlView` and `sqliteView` respectively with identical syntax.
|
|
31
|
+
|
|
32
|
+
### Selecting Specific Columns
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
export const customersView = pgView("customers_view").as((qb) => {
|
|
36
|
+
return qb
|
|
37
|
+
.select({
|
|
38
|
+
id: user.id,
|
|
39
|
+
name: user.name,
|
|
40
|
+
email: user.email,
|
|
41
|
+
})
|
|
42
|
+
.from(user);
|
|
43
|
+
});
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Standalone Query Builder
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
import { pgTable, pgView, serial, text, timestamp, QueryBuilder } from "drizzle-orm/pg-core";
|
|
50
|
+
|
|
51
|
+
const qb = new QueryBuilder();
|
|
52
|
+
|
|
53
|
+
export const userView = pgView("user_view").as(qb.select().from(user));
|
|
54
|
+
export const customersView = pgView("customers_view").as(
|
|
55
|
+
qb.select().from(user).where(eq(user.role, "customer"))
|
|
56
|
+
);
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Raw SQL Declaration
|
|
60
|
+
|
|
61
|
+
When query builder syntax is insufficient, use `sql` operator with explicit column schema:
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
const newYorkers = pgView('new_yorkers', {
|
|
65
|
+
id: serial('id').primaryKey(),
|
|
66
|
+
name: text('name').notNull(),
|
|
67
|
+
cityId: integer('city_id').notNull(),
|
|
68
|
+
}).as(sql`select * from ${users} where ${eq(users.cityId, 1)}`);
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Existing Views
|
|
72
|
+
|
|
73
|
+
For read-only access to existing database views, use `.existing()` to prevent migration generation:
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
export const trimmedUser = pgView("trimmed_user", {
|
|
77
|
+
id: serial("id"),
|
|
78
|
+
name: text("name"),
|
|
79
|
+
email: text("email"),
|
|
80
|
+
}).existing();
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Materialized Views (PostgreSQL Only)
|
|
84
|
+
|
|
85
|
+
PostgreSQL supports materialized views that persist results in table-like form.
|
|
86
|
+
|
|
87
|
+
```ts
|
|
88
|
+
const newYorkers = pgMaterializedView('new_yorkers').as((qb) =>
|
|
89
|
+
qb.select().from(users).where(eq(users.cityId, 1))
|
|
90
|
+
);
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Refresh at runtime:
|
|
94
|
+
```ts
|
|
95
|
+
await db.refreshMaterializedView(newYorkers);
|
|
96
|
+
await db.refreshMaterializedView(newYorkers).concurrently();
|
|
97
|
+
await db.refreshMaterializedView(newYorkers).withNoData();
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Extended Configuration
|
|
101
|
+
|
|
102
|
+
Views support additional options via `.with()`, `.using()`, `.tablespace()`, and `.withNoData()`:
|
|
103
|
+
|
|
104
|
+
```ts
|
|
105
|
+
const newYorkers = pgView('new_yorkers')
|
|
106
|
+
.with({
|
|
107
|
+
checkOption: 'cascaded',
|
|
108
|
+
securityBarrier: true,
|
|
109
|
+
securityInvoker: true,
|
|
110
|
+
})
|
|
111
|
+
.as((qb) => {
|
|
112
|
+
const sq = qb
|
|
113
|
+
.$with('sq')
|
|
114
|
+
.as(
|
|
115
|
+
qb.select({ userId: users.id, cityId: cities.id })
|
|
116
|
+
.from(users)
|
|
117
|
+
.leftJoin(cities, eq(cities.id, users.homeCity))
|
|
118
|
+
.where(sql`${users.age1} > 18`),
|
|
119
|
+
);
|
|
120
|
+
return qb.with(sq).select().from(sq).where(sql`${users.homeCity} = 1`);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
const newYorkers2 = pgMaterializedView('new_yorkers')
|
|
124
|
+
.using('btree')
|
|
125
|
+
.with({
|
|
126
|
+
fillfactor: 90,
|
|
127
|
+
toast_tuple_target: 0.5,
|
|
128
|
+
autovacuum_enabled: true,
|
|
129
|
+
})
|
|
130
|
+
.tablespace('custom_tablespace')
|
|
131
|
+
.withNoData()
|
|
132
|
+
.as((qb) => { /* ... */ });
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**Supported databases**: PostgreSQL, SQLite, MySQL (not SingleStore)
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
## Headless ORM Philosophy
|
|
2
|
+
Drizzle is a headless TypeScript ORM - a library and collection of opt-in tools that lets you build projects with it, not around it. Unlike data frameworks (Django-like, Spring-like), Drizzle doesn't force your project structure.
|
|
3
|
+
|
|
4
|
+
## SQL-Like Query API
|
|
5
|
+
Drizzle embraces SQL at its core. If you know SQL, you know Drizzle - zero to minimal learning curve. It provides SQL schema declaration, SQL-like queries, automatic migrations, and a relational query API.
|
|
6
|
+
|
|
7
|
+
Example - SQL-like queries:
|
|
8
|
+
```typescript
|
|
9
|
+
await db
|
|
10
|
+
.select()
|
|
11
|
+
.from(countries)
|
|
12
|
+
.leftJoin(cities, eq(cities.countryId, countries.id))
|
|
13
|
+
.where(eq(countries.id, 10))
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Schema definition:
|
|
17
|
+
```typescript
|
|
18
|
+
export const countries = pgTable('countries', {
|
|
19
|
+
id: serial('id').primaryKey(),
|
|
20
|
+
name: varchar('name', { length: 256 }),
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
export const cities = pgTable('cities', {
|
|
24
|
+
id: serial('id').primaryKey(),
|
|
25
|
+
name: varchar('name', { length: 256 }),
|
|
26
|
+
countryId: integer('country_id').references(() => countries.id),
|
|
27
|
+
});
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Generated migration:
|
|
31
|
+
```sql
|
|
32
|
+
CREATE TABLE IF NOT EXISTS "countries" (
|
|
33
|
+
"id" serial PRIMARY KEY NOT NULL,
|
|
34
|
+
"name" varchar(256)
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
CREATE TABLE IF NOT EXISTS "cities" (
|
|
38
|
+
"id" serial PRIMARY KEY NOT NULL,
|
|
39
|
+
"name" varchar(256),
|
|
40
|
+
"country_id" integer
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
ALTER TABLE "cities" ADD CONSTRAINT "cities_country_id_countries_id_fk" FOREIGN KEY ("country_id") REFERENCES "countries"("id") ON DELETE no action ON UPDATE no action;
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Relational Query API
|
|
47
|
+
For common scenarios where SQL-like queries aren't optimal, Drizzle provides a Queries API for fetching nested relational data conveniently and performantly. Always outputs exactly 1 SQL query, making it serverless-database friendly.
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
const result = await db.query.users.findMany({
|
|
51
|
+
with: {
|
|
52
|
+
posts: true
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Serverless-Ready Design
|
|
58
|
+
Drizzle has zero dependencies. It's dialect-specific, slim, performant, and serverless-ready by design. Supports PostgreSQL, MySQL, and SQLite through industry-standard database drivers.
|
|
59
|
+
|
|
60
|
+
## Key Characteristics
|
|
61
|
+
- Lightweight, performant, typesafe
|
|
62
|
+
- Non-intrusive to project structure
|
|
63
|
+
- Both SQL-like and relational query APIs
|
|
64
|
+
- Zero dependencies
|
|
65
|
+
- Serverless-ready
|
|
66
|
+
- Full SQL dialect support
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
## Overview
|
|
2
|
+
`drizzle-zod` is a plugin that generates Zod schemas from Drizzle ORM schemas for validation.
|
|
3
|
+
|
|
4
|
+
**Requirements:** drizzle-zod@0.6.0+, Drizzle ORM v0.36.0+, Zod v3.25.1+
|
|
5
|
+
|
|
6
|
+
## Select Schema
|
|
7
|
+
Validates data queried from the database (API responses).
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
import { pgTable, text, integer } from 'drizzle-orm/pg-core';
|
|
11
|
+
import { createSelectSchema } from 'drizzle-zod';
|
|
12
|
+
|
|
13
|
+
const users = pgTable('users', {
|
|
14
|
+
id: integer().generatedAlwaysAsIdentity().primaryKey(),
|
|
15
|
+
name: text().notNull(),
|
|
16
|
+
age: integer().notNull()
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
const userSelectSchema = createSelectSchema(users);
|
|
20
|
+
const rows = await db.select().from(users).limit(1);
|
|
21
|
+
const parsed = userSelectSchema.parse(rows[0]); // { id: number; name: string; age: number }
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Supports views and enums:
|
|
25
|
+
```ts
|
|
26
|
+
const roles = pgEnum('roles', ['admin', 'basic']);
|
|
27
|
+
const rolesSchema = createSelectSchema(roles);
|
|
28
|
+
|
|
29
|
+
const usersView = pgView('users_view').as((qb) => qb.select().from(users).where(gt(users.age, 18)));
|
|
30
|
+
const usersViewSchema = createSelectSchema(usersView);
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Insert Schema
|
|
34
|
+
Validates data to be inserted (API requests).
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
import { createInsertSchema } from 'drizzle-zod';
|
|
38
|
+
|
|
39
|
+
const userInsertSchema = createInsertSchema(users);
|
|
40
|
+
const user = { name: 'Jane', age: 30 };
|
|
41
|
+
const parsed = userInsertSchema.parse(user); // { name: string, age: number }
|
|
42
|
+
await db.insert(users).values(parsed);
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Update Schema
|
|
46
|
+
Validates data to be updated. Generated columns cannot be updated.
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
import { createUpdateSchema } from 'drizzle-zod';
|
|
50
|
+
|
|
51
|
+
const userUpdateSchema = createUpdateSchema(users);
|
|
52
|
+
const user = { age: 35 };
|
|
53
|
+
const parsed = userUpdateSchema.parse(user); // { name?: string | undefined, age?: number | undefined }
|
|
54
|
+
await db.update(users).set(parsed).where(eq(users.name, 'Jane'));
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Refinements
|
|
58
|
+
Extend, modify, or overwrite field schemas via optional parameter:
|
|
59
|
+
|
|
60
|
+
```ts
|
|
61
|
+
const userSelectSchema = createSelectSchema(users, {
|
|
62
|
+
name: (schema) => schema.max(20), // Extends schema
|
|
63
|
+
bio: (schema) => schema.max(1000), // Extends before nullability
|
|
64
|
+
preferences: z.object({ theme: z.string() }) // Overwrites field
|
|
65
|
+
});
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Factory Functions
|
|
69
|
+
`createSchemaFactory` for advanced use cases.
|
|
70
|
+
|
|
71
|
+
**Extended Zod instance:**
|
|
72
|
+
```ts
|
|
73
|
+
import { createSchemaFactory } from 'drizzle-zod';
|
|
74
|
+
import { z } from '@hono/zod-openapi';
|
|
75
|
+
|
|
76
|
+
const { createInsertSchema } = createSchemaFactory({ zodInstance: z });
|
|
77
|
+
const userInsertSchema = createInsertSchema(users, {
|
|
78
|
+
name: (schema) => schema.openapi({ example: 'John' })
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Type coercion:**
|
|
83
|
+
```ts
|
|
84
|
+
const { createInsertSchema } = createSchemaFactory({
|
|
85
|
+
coerce: { date: true } // or coerce: true for all types
|
|
86
|
+
});
|
|
87
|
+
const userInsertSchema = createInsertSchema(users);
|
|
88
|
+
// createdAt: z.coerce.date()
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Data Type Reference
|
|
92
|
+
Comprehensive mapping of Drizzle column types to Zod schemas:
|
|
93
|
+
|
|
94
|
+
- **Boolean:** `pg.boolean()` → `z.boolean()`
|
|
95
|
+
- **Date:** `pg.date({ mode: 'date' })`, `pg.timestamp({ mode: 'date' })` → `z.date()`
|
|
96
|
+
- **String:** `pg.text()`, `pg.varchar()`, `mysql.binary()` → `z.string()`
|
|
97
|
+
- **UUID:** `pg.uuid()` → `z.string().uuid()`
|
|
98
|
+
- **Char:** `pg.char({ length: 10 })` → `z.string().length(10)`
|
|
99
|
+
- **Varchar:** `pg.varchar({ length: 100 })` → `z.string().max(100)`
|
|
100
|
+
- **MySQL text variants:** `tinytext` → `z.string().max(255)`, `text` → `z.string().max(65_535)`, `mediumtext` → `z.string().max(16_777_215)`, `longtext` → `z.string().max(4_294_967_295)`
|
|
101
|
+
- **Enum:** `pg.text({ enum: ['a', 'b'] })` → `z.enum(['a', 'b'])`
|
|
102
|
+
- **Bit:** `pg.bit({ dimensions: 8 })` → `z.string().regex(/^[01]+$/).max(8)`
|
|
103
|
+
- **Integer types:** `pg.smallint()` → `z.number().min(-32_768).max(32_767).int()`, `pg.integer()` → `z.number().min(-2_147_483_648).max(2_147_483_647).int()`, `mysql.tinyint()` → `z.number().min(-128).max(127).int()`, unsigned variants adjust min to 0
|
|
104
|
+
- **Float/Double:** `pg.real()`, `mysql.float()` → `z.number()` with appropriate bit limits
|
|
105
|
+
- **BigInt:** `pg.bigint({ mode: 'bigint' })` → `z.bigint().min(-9_223_372_036_854_775_808n).max(9_223_372_036_854_775_807n)`, unsigned → `z.bigint().min(0).max(18_446_744_073_709_551_615n)`
|
|
106
|
+
- **BigInt (number mode):** `pg.bigint({ mode: 'number' })` → `z.number().min(-9_007_199_254_740_991).max(9_007_199_254_740_991).int()`
|
|
107
|
+
- **Year:** `mysql.year()` → `z.number().min(1_901).max(2_155).int()`
|
|
108
|
+
- **Geometry:** `pg.point({ mode: 'tuple' })` → `z.tuple([z.number(), z.number()])`, `pg.point({ mode: 'xy' })` → `z.object({ x: z.number(), y: z.number() })`
|
|
109
|
+
- **Vector:** `pg.vector({ dimensions: 3 })` → `z.array(z.number()).length(3)`
|
|
110
|
+
- **Line:** `pg.line({ mode: 'abc' })` → `z.object({ a: z.number(), b: z.number(), c: z.number() })`, `pg.line({ mode: 'tuple' })` → `z.tuple([z.number(), z.number(), z.number()])`
|
|
111
|
+
- **JSON:** `pg.json()`, `pg.jsonb()` → `z.union([z.union([z.string(), z.number(), z.boolean(), z.null()]), z.record(z.any()), z.array(z.any())])`
|
|
112
|
+
- **Buffer:** `sqlite.blob({ mode: 'buffer' })` → `z.custom<Buffer>((v) => v instanceof Buffer)`
|
|
113
|
+
- **Array:** `pg.dataType().array(size)` → `z.array(baseDataTypeSchema).length(size)`
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
This is the complete Drizzle ORM documentation covering all aspects of the library. It includes:
|
|
2
|
+
|
|
3
|
+
**Core Concepts**: Drizzle is a headless TypeScript ORM with SQL-like and relational query APIs, zero dependencies, and serverless-ready design. It supports PostgreSQL, MySQL, SQLite, and SingleStore.
|
|
4
|
+
|
|
5
|
+
**Schema Definition**: Define tables using dialect-specific functions (pgTable, mysqlTable, sqliteTable) with typed columns. Supports constraints (NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK, DEFAULT), indexes, and relations. PostgreSQL supports schemas via pgSchema, MySQL schemas are databases, SQLite has no schemas.
|
|
6
|
+
|
|
7
|
+
**Column Types**: Comprehensive type system across all databases including numeric (int, serial, bigint, decimal, real), string (text, varchar, char), boolean, date/time (date, timestamp, time), JSON, arrays (PostgreSQL), and specialized types (UUID, point, geometry, vector, enum). Supports type inference with `.$type<T>()` and runtime defaults via `.$defaultFn()` and `.$onUpdate()`.
|
|
8
|
+
|
|
9
|
+
**Query APIs**: Two approaches - SQL-like syntax mirroring SQL (select/insert/update/delete with joins, filters, aggregations) and Relational Queries API for nested data fetching. Both are type-safe and generate exactly one SQL statement.
|
|
10
|
+
|
|
11
|
+
**Filtering & Operators**: Comparison (eq, ne, gt, gte, lt, lte), existence (exists, notExists), null checks (isNull, isNotNull), arrays (inArray, notInArray), ranges (between, notBetween), patterns (like, ilike), logical (not, and, or), and PostgreSQL-specific array operators (arrayContains, arrayContained, arrayOverlaps).
|
|
12
|
+
|
|
13
|
+
**Advanced Queries**: CTEs (WITH clauses), subqueries, aggregations (count, sum, avg, max, min with distinct variants), pagination (limit/offset and cursor-based), joins (left/right/inner/full/cross with lateral variants), set operations (UNION, INTERSECT, EXCEPT with ALL variants), and full-text search (PostgreSQL with tsvector/tsquery, weighted multi-column search, ranking).
|
|
14
|
+
|
|
15
|
+
**Mutations**: Insert (single/multiple rows, returning, $returningId for MySQL/SingleStore, onConflict/onDuplicate for upserts), update (with set, where, limit, orderBy, returning, FROM joins), delete (with where, limit, orderBy, returning). All support WITH clauses.
|
|
16
|
+
|
|
17
|
+
**Relationships**: Define one-to-one, one-to-many, and many-to-many relations using one() and many() operators. Relations are application-level abstractions independent from database foreign keys. Foreign key actions (CASCADE, RESTRICT, NO ACTION, SET NULL, SET DEFAULT) control delete/update behavior.
|
|
18
|
+
|
|
19
|
+
**Database Setup**: Comprehensive guides for 30+ platforms including PostgreSQL (node-postgres, postgres.js), MySQL (mysql2), SQLite (libsql, better-sqlite3, bun:sqlite, expo-sqlite, op-sqlite), serverless options (Neon, Supabase, Vercel Postgres, PlanetScale, Turso, Cloudflare D1), edge functions (Netlify, Supabase, Vercel), and specialized platforms (Xata, Nile, TiDB, PGLite, Prisma Postgres).
|
|
20
|
+
|
|
21
|
+
**Drizzle Kit**: CLI tool for migrations with commands: generate (create SQL from schema changes), migrate (apply migrations), push (sync schema directly), pull (introspect existing database), studio (local database browser), check (validate migration history), up (upgrade snapshots), export (output DDL). Configured via drizzle.config.ts with dialect, schema paths, database credentials, and optional filters.
|
|
22
|
+
|
|
23
|
+
**Migrations**: Six strategies - database-first (pull), codebase-first with direct push, SQL file generation with CLI/runtime application, manual application, or export for external tools. Supports custom migration names, empty migrations for manual SQL, and custom migrations table/schema configuration.
|
|
24
|
+
|
|
25
|
+
**Advanced Features**:
|
|
26
|
+
- Prepared statements for performance with placeholders
|
|
27
|
+
- Transactions with nested savepoints, rollback conditions, and dialect-specific isolation levels
|
|
28
|
+
- Read replicas with automatic routing via withReplicas()
|
|
29
|
+
- Row-Level Security (PostgreSQL) with policies, roles, and provider support (Neon, Supabase)
|
|
30
|
+
- Batch API for LibSQL, Neon, D1 (multiple statements in single call)
|
|
31
|
+
- Query caching with Upstash Redis or custom implementation
|
|
32
|
+
- Dynamic query building with .$dynamic() for reusable functions
|
|
33
|
+
- Sequences (PostgreSQL) for auto-incrementing IDs
|
|
34
|
+
- Generated columns (PostgreSQL STORED, MySQL/SQLite STORED/VIRTUAL)
|
|
35
|
+
- Views (inline/standalone/raw SQL, materialized views for PostgreSQL)
|
|
36
|
+
- Custom types via customType() with toDriver/fromDriver mapping
|
|
37
|
+
- HTTP proxy driver for custom database communication
|
|
38
|
+
- Logging configuration with DefaultLogger or custom Logger
|
|
39
|
+
- Multi-project schema namespacing with pgTableCreator
|
|
40
|
+
- Type helpers (InferSelectModel, InferInsertModel, getTableColumns, getTableConfig)
|
|
41
|
+
- Mock driver for testing
|
|
42
|
+
|
|
43
|
+
**Validation Plugins**: Generate validation schemas from Drizzle tables:
|
|
44
|
+
- Zod (createSelectSchema, createInsertSchema, createUpdateSchema with refinements)
|
|
45
|
+
- Valibot (same API as Zod)
|
|
46
|
+
- Typebox (same API)
|
|
47
|
+
- Arktype (same API)
|
|
48
|
+
- All support field refinements and comprehensive type mappings
|
|
49
|
+
|
|
50
|
+
**Patterns & Recipes**: Conditional filtering, counting rows, column selection, parent-child queries, pagination (limit/offset and cursor-based), incrementing/decrementing, toggling booleans, bulk updates with CASE, upserts, full-text search, vector similarity search, geospatial queries (point distance, rectangular boundaries, PostGIS), timestamp defaults, empty array defaults, case-insensitive unique emails, seeding with related entities.
|
|
51
|
+
|
|
52
|
+
**Seeding**: drizzle-seed for deterministic fake data generation with seedable pRNG. 30+ generators (numeric, string, person, location, business, geometric) with options for uniqueness, ranges, arrays. Supports weighted distributions, related entity creation, and versioning for reproducible outputs.
|
|
53
|
+
|
|
54
|
+
**Ecosystem**: GraphQL schema generation (drizzle-graphql), Prisma extension for native Drizzle integration, ESLint plugin with enforce-delete-with-where and enforce-update-with-where rules.
|
|
55
|
+
|
|
56
|
+
**Migration Guides**: Step-by-step guides from Prisma, Sequelize, and TypeORM to Drizzle with query pattern replacements.
|
|
57
|
+
|
|
58
|
+
**Getting Started**: Quick start with PostgreSQL, edge function integration (Netlify, Supabase, Vercel), database provider guides (Neon, Supabase, Turso, Vercel Postgres, Xata, Nile), and complete Next.js todo app tutorial.
|
|
59
|
+
|
|
60
|
+
**Release Notes**: Evolution from v0.11.0 through v0.32.2 documenting feature additions including schema constraints, query building, drivers, timestamp handling, advanced features (pg_vector, PostGIS, prepared statements, batch API, caching, dynamic queries, sequences, generated columns).
|
package/package.json
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lunarhue/expo-wa-sqlite",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "src/index.ts",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": "./src/index.ts"
|
|
8
|
+
},
|
|
9
|
+
"dependencies": {
|
|
10
|
+
"@lunarhue/wa-sqlite": "1.0.14"
|
|
11
|
+
},
|
|
12
|
+
"peerDependencies": {
|
|
13
|
+
"drizzle-orm": "*",
|
|
14
|
+
"expo": "*",
|
|
15
|
+
"react": "*"
|
|
16
|
+
},
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@types/react": "^19.2.14",
|
|
19
|
+
"typescript": "^5.3.3"
|
|
20
|
+
},
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc -p tsconfig.json"
|
|
23
|
+
}
|
|
24
|
+
}
|