@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,72 @@
|
|
|
1
|
+
## Fixes
|
|
2
|
+
|
|
3
|
+
- **withReplica**: Fixed argument forwarding when using the withReplica feature
|
|
4
|
+
- **selectDistinctOn**: Fixed issue where selectDistinctOn was not working with multiple columns
|
|
5
|
+
|
|
6
|
+
## New Features
|
|
7
|
+
|
|
8
|
+
### Detailed JSDoc for Query Builders
|
|
9
|
+
JSDoc documentation is now available for all query builders across all dialects, providing hints and documentation links directly in IDEs.
|
|
10
|
+
|
|
11
|
+
### Aggregate Function Helpers
|
|
12
|
+
New SQL helper functions for aggregation operations (typically used with GROUP BY):
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
// count
|
|
16
|
+
await db.select({ value: count() }).from(users);
|
|
17
|
+
await db.select({ value: count(users.id) }).from(users);
|
|
18
|
+
|
|
19
|
+
// countDistinct
|
|
20
|
+
await db.select({ value: countDistinct(users.id) }).from(users);
|
|
21
|
+
|
|
22
|
+
// avg / avgDistinct
|
|
23
|
+
await db.select({ value: avg(users.id) }).from(users);
|
|
24
|
+
await db.select({ value: avgDistinct(users.id) }).from(users);
|
|
25
|
+
|
|
26
|
+
// sum / sumDistinct
|
|
27
|
+
await db.select({ value: sum(users.id) }).from(users);
|
|
28
|
+
await db.select({ value: sumDistinct(users.id) }).from(users);
|
|
29
|
+
|
|
30
|
+
// max / min
|
|
31
|
+
await db.select({ value: max(users.id) }).from(users);
|
|
32
|
+
await db.select({ value: min(users.id) }).from(users);
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
These are equivalent to using `sql` template with `.mapWith()` for type mapping.
|
|
36
|
+
|
|
37
|
+
### ESLint Drizzle Plugin
|
|
38
|
+
New package `eslint-plugin-drizzle` for enforcing best practices where type checking is insufficient.
|
|
39
|
+
|
|
40
|
+
**Installation**:
|
|
41
|
+
```
|
|
42
|
+
npm install eslint eslint-plugin-drizzle
|
|
43
|
+
npm install @typescript-eslint/eslint-plugin @typescript-eslint/parser
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Configuration** (`.eslintrc.yml`):
|
|
47
|
+
```yaml
|
|
48
|
+
root: true
|
|
49
|
+
parser: '@typescript-eslint/parser'
|
|
50
|
+
parserOptions:
|
|
51
|
+
project: './tsconfig.json'
|
|
52
|
+
plugins:
|
|
53
|
+
- drizzle
|
|
54
|
+
rules:
|
|
55
|
+
'drizzle/enforce-delete-with-where': "error"
|
|
56
|
+
'drizzle/enforce-update-with-where': "error"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Or use the `all`/`recommended` config:
|
|
60
|
+
```yaml
|
|
61
|
+
extends:
|
|
62
|
+
- "plugin:drizzle/all"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Rules**:
|
|
66
|
+
|
|
67
|
+
1. **enforce-delete-with-where**: Requires `.where()` clause in `.delete()` statements to prevent accidental deletion of all rows. Optionally configure `drizzleObjectName` to target specific objects:
|
|
68
|
+
```json
|
|
69
|
+
"drizzle/enforce-delete-with-where": ["error", { "drizzleObjectName": ["db"] }]
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
2. **enforce-update-with-where**: Requires `.where()` clause in `.update()` statements to prevent accidental updates of all rows. Same `drizzleObjectName` option available.
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
## Bug Fixes
|
|
2
|
+
- Improved planescale relational tests
|
|
3
|
+
- Fixed string escaping for empty PgArrays
|
|
4
|
+
- Fixed incorrect syntax for SQLite exists function
|
|
5
|
+
- Fixed date handling in AWS Data API
|
|
6
|
+
- Fixed Hermes mixins constructor issue
|
|
7
|
+
|
|
8
|
+
## ESLint Plugin v0.2.3
|
|
9
|
+
- Added support for Drizzle objects retrieved from functions
|
|
10
|
+
- Improved error message context in suggestions
|
|
11
|
+
|
|
12
|
+
## New: Expo SQLite Driver
|
|
13
|
+
|
|
14
|
+
Install packages:
|
|
15
|
+
```bash
|
|
16
|
+
npm install drizzle-orm expo-sqlite@next
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Basic usage:
|
|
20
|
+
```ts
|
|
21
|
+
import { drizzle } from "drizzle-orm/expo-sqlite";
|
|
22
|
+
import { openDatabaseSync } from "expo-sqlite";
|
|
23
|
+
|
|
24
|
+
const expoDb = openDatabaseSync("db.db");
|
|
25
|
+
const db = drizzle(expoDb);
|
|
26
|
+
|
|
27
|
+
await db.select().from(...);
|
|
28
|
+
// or
|
|
29
|
+
db.select().from(...).then(...);
|
|
30
|
+
// or
|
|
31
|
+
db.select().from(...).all();
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
For migrations support, configure Babel and Metro:
|
|
35
|
+
|
|
36
|
+
**babel.config.js:**
|
|
37
|
+
```ts
|
|
38
|
+
module.exports = function(api) {
|
|
39
|
+
api.cache(true);
|
|
40
|
+
return {
|
|
41
|
+
presets: ['babel-preset-expo'],
|
|
42
|
+
plugins: [["inline-import", { "extensions": [".sql"] }]]
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**metro.config.js:**
|
|
48
|
+
```ts
|
|
49
|
+
const { getDefaultConfig } = require('expo/metro-config');
|
|
50
|
+
const config = getDefaultConfig(__dirname);
|
|
51
|
+
config.resolver.sourceExts.push('sql');
|
|
52
|
+
module.exports = config;
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**drizzle.config.ts:**
|
|
56
|
+
```ts
|
|
57
|
+
import type { Config } from 'drizzle-kit';
|
|
58
|
+
|
|
59
|
+
export default {
|
|
60
|
+
schema: './db/schema.ts',
|
|
61
|
+
out: './drizzle',
|
|
62
|
+
dialect: 'sqlite',
|
|
63
|
+
driver: 'expo',
|
|
64
|
+
} satisfies Config;
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Generate migrations:
|
|
68
|
+
```bash
|
|
69
|
+
npx drizzle-kit generate
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Use migrations in **App.tsx:**
|
|
73
|
+
```ts
|
|
74
|
+
import { drizzle } from "drizzle-orm/expo-sqlite";
|
|
75
|
+
import { openDatabaseSync } from "expo-sqlite";
|
|
76
|
+
import { useMigrations } from 'drizzle-orm/expo-sqlite/migrator';
|
|
77
|
+
import migrations from './drizzle/migrations';
|
|
78
|
+
|
|
79
|
+
const expoDb = openDatabaseSync("db.db");
|
|
80
|
+
const db = drizzle(expoDb);
|
|
81
|
+
|
|
82
|
+
export default function App() {
|
|
83
|
+
const { success, error } = useMigrations(db, migrations);
|
|
84
|
+
|
|
85
|
+
if (error) {
|
|
86
|
+
return <View><Text>Migration error: {error.message}</Text></View>;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (!success) {
|
|
90
|
+
return <View><Text>Migration is in progress...</Text></View>;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return ...your application component;
|
|
94
|
+
}
|
|
95
|
+
```
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
## v0.29.3 Release
|
|
2
|
+
|
|
3
|
+
**Fix:** Expo peer dependencies are now optional.
|
|
4
|
+
|
|
5
|
+
This release addresses an issue where Expo peer dependencies were required, which could cause problems for users not using Expo. The fix makes these dependencies optional, allowing developers to use DrizzleORM with Expo SQLite without unnecessary dependency constraints.
|
|
6
|
+
|
|
7
|
+
Related: Expo documentation and Expo SQLite integration guide.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
## Neon HTTP Batch Support
|
|
2
|
+
|
|
3
|
+
Added support for batching multiple queries in a single request using Neon's HTTP driver:
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
import { neon } from '@neondatabase/serverless';
|
|
7
|
+
import { drizzle } from 'drizzle-orm/neon-http';
|
|
8
|
+
import { usersTable } from './schema';
|
|
9
|
+
|
|
10
|
+
const sql = neon(process.env.DRIZZLE_DATABASE_URL!);
|
|
11
|
+
const db = drizzle(sql);
|
|
12
|
+
|
|
13
|
+
const batchResponse = await db.batch([
|
|
14
|
+
db.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),
|
|
15
|
+
db.insert(usersTable).values({ id: 2, name: 'Dan' }),
|
|
16
|
+
db.query.usersTable.findMany({}),
|
|
17
|
+
db.query.usersTable.findFirst({}),
|
|
18
|
+
]);
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
The batch method returns a tuple with typed results for each query in the batch.
|
|
22
|
+
|
|
23
|
+
## PlanetScale Client Instance Update
|
|
24
|
+
|
|
25
|
+
Updated PlanetScale integration to use `Client` instance instead of `connect()` function:
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
import { Client } from '@planetscale/database';
|
|
29
|
+
import { drizzle } from 'drizzle-orm/planetscale-serverless';
|
|
30
|
+
|
|
31
|
+
const client = new Client({
|
|
32
|
+
host: process.env['DATABASE_HOST'],
|
|
33
|
+
username: process.env['DATABASE_USERNAME'],
|
|
34
|
+
password: process.env['DATABASE_PASSWORD'],
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const db = drizzle(client);
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Breaking change warning**: Version 0.30.0 will require `Client` instances and reject `connect()` results. A deprecation warning is shown in v0.29.4 when using `connect()`. Migrate now to avoid runtime errors.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
## WITH Statements for INSERT, UPDATE, DELETE
|
|
2
|
+
|
|
3
|
+
You can now use `WITH` (CTE) clauses with INSERT, UPDATE, and DELETE statements.
|
|
4
|
+
|
|
5
|
+
Example with DELETE:
|
|
6
|
+
```ts
|
|
7
|
+
const averageAmount = db.$with('average_amount').as(
|
|
8
|
+
db.select({ value: sql`avg(${orders.amount})`.as('value') }).from(orders),
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
const result = await db
|
|
12
|
+
.with(averageAmount)
|
|
13
|
+
.delete(orders)
|
|
14
|
+
.where(gt(orders.amount, sql`(select * from ${averageAmount})`))
|
|
15
|
+
.returning({ id: orders.id });
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Generates:
|
|
19
|
+
```sql
|
|
20
|
+
with "average_amount" as (select avg("amount") as "value" from "orders")
|
|
21
|
+
delete from "orders"
|
|
22
|
+
where "orders"."amount" > (select * from "average_amount")
|
|
23
|
+
returning "id";
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Custom Migrations Table and Schema
|
|
27
|
+
|
|
28
|
+
**Custom migrations table name** (all databases):
|
|
29
|
+
```ts
|
|
30
|
+
await migrate(db, {
|
|
31
|
+
migrationsFolder: './drizzle',
|
|
32
|
+
migrationsTable: 'my_migrations',
|
|
33
|
+
});
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
By default migrations are stored in `__drizzle_migrations` table (in `drizzle` schema for PostgreSQL).
|
|
37
|
+
|
|
38
|
+
**Custom migrations schema** (PostgreSQL only):
|
|
39
|
+
```ts
|
|
40
|
+
await migrate(db, {
|
|
41
|
+
migrationsFolder: './drizzle',
|
|
42
|
+
migrationsSchema: 'custom',
|
|
43
|
+
});
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## SQLite Proxy Batch and Relational Queries
|
|
47
|
+
|
|
48
|
+
SQLite proxy driver now supports:
|
|
49
|
+
- Relational queries: `.query.findFirst()` and `.query.findMany()`
|
|
50
|
+
- Batch requests via `db.batch([])`
|
|
51
|
+
|
|
52
|
+
Batch callback setup:
|
|
53
|
+
```ts
|
|
54
|
+
import { drizzle } from 'drizzle-orm/sqlite-proxy';
|
|
55
|
+
|
|
56
|
+
type ResponseType = { rows: any[][] | any[] }[];
|
|
57
|
+
|
|
58
|
+
const db = drizzle(
|
|
59
|
+
async (sql, params, method) => {
|
|
60
|
+
// single query logic
|
|
61
|
+
},
|
|
62
|
+
async (queries: { sql: string; params: any[]; method: 'all' | 'run' | 'get' | 'values' }[]) => {
|
|
63
|
+
const result: ResponseType = await axios.post('http://localhost:3000/batch', { queries });
|
|
64
|
+
return result;
|
|
65
|
+
},
|
|
66
|
+
);
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Response must be an array of raw values in the same order as sent queries.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
## Breaking Changes: Postgres Timestamp Handling
|
|
2
|
+
|
|
3
|
+
The `postgres.js` driver instance has been modified to always return strings for dates. Drizzle then maps these to either strings or Date objects based on the selected `mode`. This is a breaking change that affects how timestamps are handled.
|
|
4
|
+
|
|
5
|
+
**Key Impact:**
|
|
6
|
+
- Timestamps with and without timezone now always use `.toISOString()` for mapping to the driver
|
|
7
|
+
- All `postgres.js` clients passed to Drizzle will have mutated behavior - dates will always be strings in responses
|
|
8
|
+
- If you were expecting specific timestamp responses, behavior has changed
|
|
9
|
+
|
|
10
|
+
**Parser Override for postgres.js:**
|
|
11
|
+
```ts
|
|
12
|
+
const transparentParser = (val: any) => val;
|
|
13
|
+
|
|
14
|
+
// Override postgres.js default date parsers
|
|
15
|
+
for (const type of ['1184', '1082', '1083', '1114']) {
|
|
16
|
+
client.options.parsers[type as any] = transparentParser;
|
|
17
|
+
client.options.serializers[type as any] = transparentParser;
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
The team notes this is not ideal since the driver client gets mutated. They're working with the `postgres.js` library creator to enable per-query mapping interceptors instead.
|
|
22
|
+
|
|
23
|
+
## Fixes
|
|
24
|
+
|
|
25
|
+
Multiple timestamp and date-related issues resolved:
|
|
26
|
+
- Timestamp with mode string returning Date object instead of string
|
|
27
|
+
- Inconsistent date/datetime handling across drivers
|
|
28
|
+
- Type mismatches (columns showing string type but returning Date objects)
|
|
29
|
+
- PostgreSQL timezone-related conversion issues
|
|
30
|
+
- Millisecond loss during timestamp inserts
|
|
31
|
+
- Invalid dates from relational queries
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
## New Features
|
|
2
|
+
|
|
3
|
+
### `.if()` function for WHERE expressions
|
|
4
|
+
|
|
5
|
+
Conditional WHERE clauses using `.if()` method:
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
await db
|
|
9
|
+
.select()
|
|
10
|
+
.from(posts)
|
|
11
|
+
.where(gt(posts.views, views).if(views > 100));
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
The `.if()` function is available on all WHERE expressions and allows conditional filtering based on runtime values.
|
|
15
|
+
|
|
16
|
+
## Bug Fixes
|
|
17
|
+
|
|
18
|
+
- Fixed internal mappings for sessions `.all()`, `.values()`, `.execute()` functions in AWS DataAPI
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
## OP-SQLite Driver Support
|
|
2
|
+
|
|
3
|
+
New driver added for OP-SQLite. Initialize with:
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
import { open } from '@op-engineering/op-sqlite';
|
|
7
|
+
import { drizzle } from 'drizzle-orm/op-sqlite';
|
|
8
|
+
|
|
9
|
+
const opsqlite = open({ name: 'myDB' });
|
|
10
|
+
const db = drizzle(opsqlite);
|
|
11
|
+
await db.select().from(users);
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Fixes
|
|
15
|
+
|
|
16
|
+
- Migration hook fixed for Expo driver
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
## Improvements
|
|
2
|
+
|
|
3
|
+
LibSQL migrations now use batch execution instead of transactions. Batch operations execute multiple SQL statements sequentially within an implicit transaction - the backend commits all changes on success or rolls back completely on any failure.
|
|
4
|
+
|
|
5
|
+
## Fixes
|
|
6
|
+
|
|
7
|
+
- Fixed findFirst query for bun:sqlite
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
## `$onUpdate` functionality for PostgreSQL, MySQL and SQLite
|
|
2
|
+
|
|
3
|
+
Adds dynamic update values to columns. The `$onUpdate()` function is called when a row is updated, and its returned value is used as the column value if none is provided. If no `default` or `$defaultFn` is set, the function is also called on insert.
|
|
4
|
+
|
|
5
|
+
Note: This is runtime-only behavior in drizzle-orm and does not affect drizzle-kit.
|
|
6
|
+
|
|
7
|
+
Example:
|
|
8
|
+
```ts
|
|
9
|
+
const usersOnUpdate = pgTable('users_on_update', {
|
|
10
|
+
id: serial('id').primaryKey(),
|
|
11
|
+
name: text('name').notNull(),
|
|
12
|
+
updateCounter: integer('update_counter').default(sql`1`).$onUpdateFn(() => sql`update_counter + 1`),
|
|
13
|
+
updatedAt: timestamp('updated_at', { mode: 'date', precision: 3 }).$onUpdate(() => new Date()),
|
|
14
|
+
alwaysNull: text('always_null').$type<string | null>().$onUpdate(() => null),
|
|
15
|
+
});
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Fixes
|
|
19
|
+
|
|
20
|
+
- Insertions on columns with smallserial datatype are now correctly non-optional (issue #1848)
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
## Fixes
|
|
2
|
+
|
|
3
|
+
- Added mappings for `@vercel/postgres` package. Vercel Postgres is a serverless PostgreSQL database service. To get started with Drizzle and Vercel Postgres, refer to the PostgreSQL getting started documentation section on Vercel Postgres.
|
|
4
|
+
|
|
5
|
+
- Fixed interval mapping for `neon` drivers (issue #1542). Neon is a serverless PostgreSQL platform. To get started with Drizzle and Neon, refer to the PostgreSQL getting started documentation section on Neon.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
## New Features
|
|
2
|
+
|
|
3
|
+
**Custom schema support for Postgres enums:**
|
|
4
|
+
```ts
|
|
5
|
+
import { pgSchema } from 'drizzle-orm/pg-core';
|
|
6
|
+
|
|
7
|
+
const mySchema = pgSchema('mySchema');
|
|
8
|
+
const colors = mySchema.enum('colors', ['red', 'green', 'blue']);
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Fixes
|
|
12
|
+
|
|
13
|
+
**D1 migrate() function:** Changed to use batch API for better performance.
|
|
14
|
+
|
|
15
|
+
**Postgres `.onConflictDoUpdate` method:** Split `where` clause into `setWhere` and `targetWhere` to support both where cases in on conflict clause.
|
|
16
|
+
```ts
|
|
17
|
+
await db.insert(employees)
|
|
18
|
+
.values({ employeeId: 123, name: 'John Doe' })
|
|
19
|
+
.onConflictDoUpdate({
|
|
20
|
+
target: employees.employeeId,
|
|
21
|
+
targetWhere: sql`name <> 'John Doe'`,
|
|
22
|
+
set: { name: sql`excluded.name` }
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
await db.insert(employees)
|
|
26
|
+
.values({ employeeId: 123, name: 'John Doe' })
|
|
27
|
+
.onConflictDoUpdate({
|
|
28
|
+
target: employees.employeeId,
|
|
29
|
+
set: { name: 'John Doe' },
|
|
30
|
+
setWhere: sql`name <> 'John Doe'`
|
|
31
|
+
});
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**Postgres `.onConflictDoNothing` method:** Fixed query generation for `where` clause placement.
|
|
35
|
+
|
|
36
|
+
**AWS Data API driver:** Fixed multiple issues including inserting and updating array values.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
## New Features
|
|
2
|
+
|
|
3
|
+
**Enhanced `.onConflictDoUpdate()` in SQLite**: Added `setWhere` and `targetWhere` fields to replace the single `where` field, enabling more granular control over conflict resolution:
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
// Using targetWhere to filter which conflicts to handle
|
|
7
|
+
await db.insert(employees)
|
|
8
|
+
.values({ employeeId: 123, name: 'John Doe' })
|
|
9
|
+
.onConflictDoUpdate({
|
|
10
|
+
target: employees.employeeId,
|
|
11
|
+
targetWhere: sql`name <> 'John Doe'`,
|
|
12
|
+
set: { name: sql`excluded.name` }
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
// Using setWhere to conditionally apply updates
|
|
16
|
+
await db.insert(employees)
|
|
17
|
+
.values({ employeeId: 123, name: 'John Doe' })
|
|
18
|
+
.onConflictDoUpdate({
|
|
19
|
+
target: employees.employeeId,
|
|
20
|
+
set: { name: 'John Doe' },
|
|
21
|
+
setWhere: sql`name <> 'John Doe'`
|
|
22
|
+
});
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Schema introspection**: Added `db._.fullSchema` to access schema information from Drizzle instances.
|
|
26
|
+
|
|
27
|
+
## Fixes
|
|
28
|
+
|
|
29
|
+
- Fixed migrator in AWS Data API
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
## Breaking Changes
|
|
2
|
+
|
|
3
|
+
**PostgreSQL indexes API was changed** to align with PostgreSQL documentation. The previous API didn't support SQL expressions in `.on()`, conflated `.using()` and `.on()`, and placed ordering modifiers on the index instead of per-column.
|
|
4
|
+
|
|
5
|
+
Previous API:
|
|
6
|
+
```ts
|
|
7
|
+
index('name')
|
|
8
|
+
.on(table.column1, table.column2)
|
|
9
|
+
.using(sql``)
|
|
10
|
+
.asc() / .desc()
|
|
11
|
+
.nullsFirst() / .nullsLast()
|
|
12
|
+
.where(sql``)
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
New API:
|
|
16
|
+
```ts
|
|
17
|
+
// With .on()
|
|
18
|
+
index('name')
|
|
19
|
+
.on(table.column1.asc(), table.column2.nullsFirst())
|
|
20
|
+
.concurrently()
|
|
21
|
+
.where(sql``)
|
|
22
|
+
.with({ fillfactor: '70' })
|
|
23
|
+
|
|
24
|
+
// With .using()
|
|
25
|
+
index('name')
|
|
26
|
+
.using('btree', table.column1.asc(), sql`lower(${table.column2})`, table.column1.op('text_ops'))
|
|
27
|
+
.where(sql``)
|
|
28
|
+
.with({ fillfactor: '70' })
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Requires `drizzle-kit@0.22.0` or higher.
|
|
32
|
+
|
|
33
|
+
## New Features
|
|
34
|
+
|
|
35
|
+
### pg_vector extension support
|
|
36
|
+
|
|
37
|
+
Define vector indexes and use vector distance functions:
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
const table = pgTable('items', {
|
|
41
|
+
embedding: vector('embedding', { dimensions: 3 })
|
|
42
|
+
}, (table) => ({
|
|
43
|
+
l2: index('l2_index').using('hnsw', table.embedding.op('vector_l2_ops')),
|
|
44
|
+
ip: index('ip_index').using('hnsw', table.embedding.op('vector_ip_ops')),
|
|
45
|
+
cosine: index('cosine_index').using('hnsw', table.embedding.op('vector_cosine_ops')),
|
|
46
|
+
l1: index('l1_index').using('hnsw', table.embedding.op('vector_l1_ops')),
|
|
47
|
+
hamming: index('hamming_index').using('hnsw', table.embedding.op('bit_hamming_ops')),
|
|
48
|
+
jaccard: index('jaccard_index').using('hnsw', table.embedding.op('bit_jaccard_ops'))
|
|
49
|
+
}))
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Helper functions for queries:
|
|
53
|
+
```ts
|
|
54
|
+
import { l2Distance, l1Distance, innerProduct, cosineDistance, hammingDistance, jaccardDistance } from 'drizzle-orm'
|
|
55
|
+
|
|
56
|
+
l2Distance(table.column, [3, 1, 2]) // <->
|
|
57
|
+
l1Distance(table.column, [3, 1, 2]) // <+>
|
|
58
|
+
innerProduct(table.column, [3, 1, 2]) // <#>
|
|
59
|
+
cosineDistance(table.column, [3, 1, 2]) // <=>
|
|
60
|
+
hammingDistance(table.column, '101') // <~>
|
|
61
|
+
jaccardDistance(table.column, '101') // <%>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Query examples:
|
|
65
|
+
```ts
|
|
66
|
+
db.select().from(items).orderBy(l2Distance(items.embedding, [3,1,2]))
|
|
67
|
+
db.select({ distance: l2Distance(items.embedding, [3,1,2]) }).from(items)
|
|
68
|
+
const subquery = db.select({ embedding: items.embedding }).from(items).where(eq(items.id, 1));
|
|
69
|
+
db.select().from(items).orderBy(l2Distance(items.embedding, subquery)).limit(5)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Custom distance functions can be created by replicating the pattern:
|
|
73
|
+
```ts
|
|
74
|
+
export function l2Distance(column: SQLWrapper | AnyColumn, value: number[] | string[] | TypedQueryBuilder<any> | string): SQL {
|
|
75
|
+
if (is(value, TypedQueryBuilder<any>) || typeof value === 'string') {
|
|
76
|
+
return sql`${column} <-> ${value}`;
|
|
77
|
+
}
|
|
78
|
+
return sql`${column} <-> ${JSON.stringify(value)}`;
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### New PostgreSQL types: point and line
|
|
83
|
+
|
|
84
|
+
**point** type with two modes:
|
|
85
|
+
```ts
|
|
86
|
+
const items = pgTable('items', {
|
|
87
|
+
point: point('point'), // tuple mode: [1,2]
|
|
88
|
+
pointObj: point('point_xy', { mode: 'xy' }), // xy mode: { x: 1, y: 2 }
|
|
89
|
+
});
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**line** type with two modes:
|
|
93
|
+
```ts
|
|
94
|
+
const items = pgTable('items', {
|
|
95
|
+
line: line('line'), // tuple mode: [1,2,3]
|
|
96
|
+
lineObj: line('line_abc', { mode: 'abc' }), // abc mode: { a: 1, b: 2, c: 3 }
|
|
97
|
+
});
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### PostGIS extension support
|
|
101
|
+
|
|
102
|
+
**geometry** type from postgis:
|
|
103
|
+
```ts
|
|
104
|
+
const items = pgTable('items', {
|
|
105
|
+
geo: geometry('geo', { type: 'point' }),
|
|
106
|
+
geoObj: geometry('geo_obj', { type: 'point', mode: 'xy' }),
|
|
107
|
+
geoSrid: geometry('geo_options', { type: 'point', mode: 'xy', srid: 4000 }),
|
|
108
|
+
});
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Modes: `tuple` (default, maps to [x,y]) and `xy` (maps to { x, y }). Type defaults to `point` but accepts any string.
|
|
112
|
+
|
|
113
|
+
## Drizzle Kit v0.22.0 Updates
|
|
114
|
+
|
|
115
|
+
### New type support
|
|
116
|
+
- `point` and `line` from PostgreSQL
|
|
117
|
+
- `vector` from pg_vector extension
|
|
118
|
+
- `geometry` from PostGIS extension
|
|
119
|
+
|
|
120
|
+
### extensionsFilters config parameter
|
|
121
|
+
|
|
122
|
+
Skip tables created by extensions:
|
|
123
|
+
```ts
|
|
124
|
+
export default defineConfig({
|
|
125
|
+
dialect: "postgresql",
|
|
126
|
+
extensionsFilters: ["postgis"], // skips geography_columns, geometry_columns, spatial_ref_sys
|
|
127
|
+
})
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### SSL configuration improvements
|
|
131
|
+
|
|
132
|
+
Full SSL parameter support:
|
|
133
|
+
```ts
|
|
134
|
+
// PostgreSQL
|
|
135
|
+
export default defineConfig({
|
|
136
|
+
dialect: "postgresql",
|
|
137
|
+
dbCredentials: {
|
|
138
|
+
ssl: true, // or "require" | "allow" | "prefer" | "verify-full" | node:tls options
|
|
139
|
+
}
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
// MySQL
|
|
143
|
+
export default defineConfig({
|
|
144
|
+
dialect: "mysql",
|
|
145
|
+
dbCredentials: {
|
|
146
|
+
ssl: "", // string | mysql2 SslOptions
|
|
147
|
+
}
|
|
148
|
+
})
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Normalized SQLite URLs
|
|
152
|
+
|
|
153
|
+
libsql and better-sqlite3 drivers now accept both file path patterns and normalize them correctly.
|
|
154
|
+
|
|
155
|
+
### MySQL and SQLite index-as-expression behavior
|
|
156
|
+
|
|
157
|
+
Expressions are no longer escaped in strings, columns are properly handled:
|
|
158
|
+
```ts
|
|
159
|
+
export const users = sqliteTable('users', {
|
|
160
|
+
id: integer('id').primaryKey(),
|
|
161
|
+
email: text('email').notNull(),
|
|
162
|
+
}, (table) => ({
|
|
163
|
+
emailUniqueIndex: uniqueIndex('emailUniqueIndex').on(sql`lower(${table.email})`),
|
|
164
|
+
}));
|
|
165
|
+
|
|
166
|
+
// Before: CREATE UNIQUE INDEX `emailUniqueIndex` ON `users` (`lower("users"."email")`);
|
|
167
|
+
// Now: CREATE UNIQUE INDEX `emailUniqueIndex` ON `users` (lower("email"));
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Index limitations
|
|
171
|
+
|
|
172
|
+
Must specify index name manually if using expressions:
|
|
173
|
+
```ts
|
|
174
|
+
index().on(table.id, table.email) // auto-named, works
|
|
175
|
+
index('my_name').on(table.id, table.email) // works
|
|
176
|
+
index().on(sql`lower(${table.email})`) // error
|
|
177
|
+
index('my_name').on(sql`lower(${table.email})`) // works
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Push won't generate statements if these fields change in existing indexes: expressions in `.on()`/`.using()`, `.where()` statements, or `.op()` operator classes. For changes, comment out the index, push, uncomment and modify, then push again. Generate command has no such limitations.
|
|
181
|
+
|
|
182
|
+
### Bug fixes
|
|
183
|
+
- Multiple constraints not added (only first generated)
|
|
184
|
+
- Drizzle Studio connection termination errors
|
|
185
|
+
- SQLite local migrations execution
|
|
186
|
+
- Unknown '--config' option errors
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
## TiDB Cloud Serverless Driver Support
|
|
2
|
+
|
|
3
|
+
Added support for TiDB Cloud Serverless driver in v0.31.2.
|
|
4
|
+
|
|
5
|
+
**Usage:**
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import { connect } from '@tidbcloud/serverless';
|
|
9
|
+
import { drizzle } from 'drizzle-orm/tidb-serverless';
|
|
10
|
+
|
|
11
|
+
const client = connect({ url: '...' });
|
|
12
|
+
const db = drizzle(client);
|
|
13
|
+
await db.select().from(...);
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Initialize a TiDB Cloud Serverless client with a connection URL, pass it to `drizzle()` from the `tidb-serverless` module, then use standard Drizzle ORM queries.
|