@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,239 @@
|
|
|
1
|
+
## Schema Organization
|
|
2
|
+
|
|
3
|
+
Drizzle schemas can be organized in a single file or spread across multiple files. All models must be exported for Drizzle-Kit to use them in migrations.
|
|
4
|
+
|
|
5
|
+
**Single file approach:**
|
|
6
|
+
```
|
|
7
|
+
src/db/schema.ts
|
|
8
|
+
```
|
|
9
|
+
Configure in `drizzle.config.ts`:
|
|
10
|
+
```ts
|
|
11
|
+
export default defineConfig({
|
|
12
|
+
dialect: 'postgresql',
|
|
13
|
+
schema: './src/db/schema.ts'
|
|
14
|
+
})
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
**Multiple files approach:**
|
|
18
|
+
```
|
|
19
|
+
src/db/schema/
|
|
20
|
+
├ users.ts
|
|
21
|
+
├ countries.ts
|
|
22
|
+
├ products.ts
|
|
23
|
+
```
|
|
24
|
+
Configure in `drizzle.config.ts`:
|
|
25
|
+
```ts
|
|
26
|
+
export default defineConfig({
|
|
27
|
+
dialect: 'postgresql',
|
|
28
|
+
schema: './src/db/schema'
|
|
29
|
+
})
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Tables and Columns
|
|
33
|
+
|
|
34
|
+
Tables must be defined with at least 1 column using dialect-specific functions (pgTable, mysqlTable, sqliteTable).
|
|
35
|
+
|
|
36
|
+
**PostgreSQL:**
|
|
37
|
+
```ts
|
|
38
|
+
import { pgTable, integer, varchar } from "drizzle-orm/pg-core";
|
|
39
|
+
export const users = pgTable('users', {
|
|
40
|
+
id: integer(),
|
|
41
|
+
firstName: varchar('first_name')
|
|
42
|
+
})
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**MySQL:**
|
|
46
|
+
```ts
|
|
47
|
+
import { mysqlTable, int, varchar } from "drizzle-orm/mysql-core";
|
|
48
|
+
export const users = mysqlTable('users', {
|
|
49
|
+
id: int(),
|
|
50
|
+
firstName: varchar('first_name', { length: 256 })
|
|
51
|
+
})
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**SQLite:**
|
|
55
|
+
```ts
|
|
56
|
+
import { sqliteTable, integer, text } from "drizzle-orm/sqlite-core";
|
|
57
|
+
export const users = sqliteTable('users', {
|
|
58
|
+
id: integer(),
|
|
59
|
+
firstName: text('first_name')
|
|
60
|
+
})
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
By default, TypeScript key names are used as database column names. Use column aliases (second parameter) to use different names.
|
|
64
|
+
|
|
65
|
+
## Camel/Snake Case Mapping
|
|
66
|
+
|
|
67
|
+
Use the `casing` option during database initialization to automatically map camelCase to snake_case:
|
|
68
|
+
|
|
69
|
+
```ts
|
|
70
|
+
const db = drizzle({
|
|
71
|
+
connection: process.env.DATABASE_URL,
|
|
72
|
+
casing: 'snake_case'
|
|
73
|
+
})
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
With this, `firstName` in TypeScript automatically maps to `first_name` in the database.
|
|
77
|
+
|
|
78
|
+
## Reusable Column Definitions
|
|
79
|
+
|
|
80
|
+
Define common columns in a helper file and spread them across tables:
|
|
81
|
+
|
|
82
|
+
```ts
|
|
83
|
+
// columns.helpers.ts
|
|
84
|
+
const timestamps = {
|
|
85
|
+
updated_at: timestamp(),
|
|
86
|
+
created_at: timestamp().defaultNow().notNull(),
|
|
87
|
+
deleted_at: timestamp(),
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// users.ts
|
|
91
|
+
export const users = pgTable('users', {
|
|
92
|
+
id: integer(),
|
|
93
|
+
...timestamps
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
// posts.ts
|
|
97
|
+
export const posts = pgTable('posts', {
|
|
98
|
+
id: integer(),
|
|
99
|
+
...timestamps
|
|
100
|
+
})
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## PostgreSQL Schemas
|
|
104
|
+
|
|
105
|
+
PostgreSQL supports schemas (namespace containers). Define with `pgSchema`:
|
|
106
|
+
|
|
107
|
+
```ts
|
|
108
|
+
import { pgSchema, integer } from "drizzle-orm/pg-core";
|
|
109
|
+
|
|
110
|
+
export const customSchema = pgSchema('custom');
|
|
111
|
+
|
|
112
|
+
export const users = customSchema.table('users', {
|
|
113
|
+
id: integer()
|
|
114
|
+
})
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## MySQL Schemas
|
|
118
|
+
|
|
119
|
+
MySQL schemas are equivalent to databases. Can be defined but won't be detected by Drizzle-Kit or included in migrations:
|
|
120
|
+
|
|
121
|
+
```ts
|
|
122
|
+
import { mysqlSchema, int } from "drizzle-orm/mysql-core";
|
|
123
|
+
|
|
124
|
+
export const customSchema = mysqlSchema('custom');
|
|
125
|
+
|
|
126
|
+
export const users = customSchema.table('users', {
|
|
127
|
+
id: int()
|
|
128
|
+
})
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## SQLite
|
|
132
|
+
|
|
133
|
+
SQLite has no schema concept; tables exist within a single file context.
|
|
134
|
+
|
|
135
|
+
## Complete Example
|
|
136
|
+
|
|
137
|
+
**PostgreSQL:**
|
|
138
|
+
```ts
|
|
139
|
+
import { pgEnum, pgTable as table, integer, varchar, uniqueIndex, index } from "drizzle-orm/pg-core";
|
|
140
|
+
import { AnyPgColumn } from "drizzle-orm/pg-core";
|
|
141
|
+
|
|
142
|
+
export const rolesEnum = pgEnum("roles", ["guest", "user", "admin"]);
|
|
143
|
+
|
|
144
|
+
export const users = table("users", {
|
|
145
|
+
id: integer().primaryKey().generatedAlwaysAsIdentity(),
|
|
146
|
+
firstName: varchar("first_name", { length: 256 }),
|
|
147
|
+
lastName: varchar("last_name", { length: 256 }),
|
|
148
|
+
email: varchar().notNull(),
|
|
149
|
+
invitee: integer().references((): AnyPgColumn => users.id),
|
|
150
|
+
role: rolesEnum().default("guest"),
|
|
151
|
+
}, (table) => [
|
|
152
|
+
uniqueIndex("email_idx").on(table.email)
|
|
153
|
+
]);
|
|
154
|
+
|
|
155
|
+
export const posts = table("posts", {
|
|
156
|
+
id: integer().primaryKey().generatedAlwaysAsIdentity(),
|
|
157
|
+
slug: varchar().$default(() => generateUniqueString(16)),
|
|
158
|
+
title: varchar({ length: 256 }),
|
|
159
|
+
ownerId: integer("owner_id").references(() => users.id),
|
|
160
|
+
}, (table) => [
|
|
161
|
+
uniqueIndex("slug_idx").on(table.slug),
|
|
162
|
+
index("title_idx").on(table.title),
|
|
163
|
+
]);
|
|
164
|
+
|
|
165
|
+
export const comments = table("comments", {
|
|
166
|
+
id: integer().primaryKey().generatedAlwaysAsIdentity(),
|
|
167
|
+
text: varchar({ length: 256 }),
|
|
168
|
+
postId: integer("post_id").references(() => posts.id),
|
|
169
|
+
ownerId: integer("owner_id").references(() => users.id),
|
|
170
|
+
});
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**MySQL:**
|
|
174
|
+
```ts
|
|
175
|
+
import { mysqlTable as table, int, varchar, mysqlEnum, uniqueIndex, index } from "drizzle-orm/mysql-core";
|
|
176
|
+
import { AnyMySqlColumn } from "drizzle-orm/mysql-core";
|
|
177
|
+
|
|
178
|
+
export const users = table("users", {
|
|
179
|
+
id: int().primaryKey().autoincrement(),
|
|
180
|
+
firstName: varchar("first_name", { length: 256 }),
|
|
181
|
+
lastName: varchar("last_name", { length: 256 }),
|
|
182
|
+
email: varchar({ length: 256 }).notNull(),
|
|
183
|
+
invitee: int().references((): AnyMySqlColumn => users.id),
|
|
184
|
+
role: mysqlEnum(["guest", "user", "admin"]).default("guest"),
|
|
185
|
+
}, (table) => [
|
|
186
|
+
uniqueIndex("email_idx").on(table.email)
|
|
187
|
+
]);
|
|
188
|
+
|
|
189
|
+
export const posts = table("posts", {
|
|
190
|
+
id: int().primaryKey().autoincrement(),
|
|
191
|
+
slug: varchar({ length: 256 }).$default(() => generateUniqueString(16)),
|
|
192
|
+
title: varchar({ length: 256 }),
|
|
193
|
+
ownerId: int("owner_id").references(() => users.id),
|
|
194
|
+
}, (table) => [
|
|
195
|
+
uniqueIndex("slug_idx").on(table.slug),
|
|
196
|
+
index("title_idx").on(table.title),
|
|
197
|
+
]);
|
|
198
|
+
|
|
199
|
+
export const comments = table("comments", {
|
|
200
|
+
id: int().primaryKey().autoincrement(),
|
|
201
|
+
text: varchar({ length: 256 }),
|
|
202
|
+
postId: int("post_id").references(() => posts.id),
|
|
203
|
+
ownerId: int("owner_id").references(() => users.id),
|
|
204
|
+
});
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**SQLite:**
|
|
208
|
+
```ts
|
|
209
|
+
import { sqliteTable as table, integer, text, uniqueIndex, index } from "drizzle-orm/sqlite-core";
|
|
210
|
+
import { AnySQLiteColumn } from "drizzle-orm/sqlite-core";
|
|
211
|
+
|
|
212
|
+
export const users = table("users", {
|
|
213
|
+
id: integer().primaryKey({ autoIncrement: true }),
|
|
214
|
+
firstName: text("first_name"),
|
|
215
|
+
lastName: text("last_name"),
|
|
216
|
+
email: text().notNull(),
|
|
217
|
+
invitee: integer().references((): AnySQLiteColumn => users.id),
|
|
218
|
+
role: text().$type<"guest" | "user" | "admin">().default("guest"),
|
|
219
|
+
}, (table) => [
|
|
220
|
+
uniqueIndex("email_idx").on(table.email)
|
|
221
|
+
]);
|
|
222
|
+
|
|
223
|
+
export const posts = table("posts", {
|
|
224
|
+
id: integer().primaryKey({ autoIncrement: true }),
|
|
225
|
+
slug: text().$default(() => generateUniqueString(16)),
|
|
226
|
+
title: text(),
|
|
227
|
+
ownerId: integer("owner_id").references(() => users.id),
|
|
228
|
+
}, (table) => [
|
|
229
|
+
uniqueIndex("slug_idx").on(table.slug),
|
|
230
|
+
index("title_idx").on(table.title),
|
|
231
|
+
]);
|
|
232
|
+
|
|
233
|
+
export const comments = table("comments", {
|
|
234
|
+
id: integer().primaryKey({ autoIncrement: true }),
|
|
235
|
+
text: text({ length: 256 }),
|
|
236
|
+
postId: integer("post_id").references(() => posts.id),
|
|
237
|
+
ownerId: integer("owner_id").references(() => users.id),
|
|
238
|
+
});
|
|
239
|
+
```
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
## Table Schemas
|
|
2
|
+
|
|
3
|
+
Drizzle ORM provides APIs for declaring SQL schemas in PostgreSQL, MySQL, and SingleStore dialects. When entities are declared within a schema, query builders prepend schema names in queries (e.g., `select * from "schema"."users"`). SQLite does not support schemas.
|
|
4
|
+
|
|
5
|
+
### PostgreSQL
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import { serial, text, pgSchema } from "drizzle-orm/pg-core";
|
|
9
|
+
|
|
10
|
+
export const mySchema = pgSchema("my_schema");
|
|
11
|
+
export const colors = mySchema.enum('colors', ['red', 'green', 'blue']);
|
|
12
|
+
export const mySchemaUsers = mySchema.table('users', {
|
|
13
|
+
id: serial('id').primaryKey(),
|
|
14
|
+
name: text('name'),
|
|
15
|
+
color: colors('color').default('red'),
|
|
16
|
+
});
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Generates:
|
|
20
|
+
```sql
|
|
21
|
+
CREATE SCHEMA "my_schema";
|
|
22
|
+
CREATE TYPE "my_schema"."colors" AS ENUM ('red', 'green', 'blue');
|
|
23
|
+
CREATE TABLE "my_schema"."users" (
|
|
24
|
+
"id" serial PRIMARY KEY,
|
|
25
|
+
"name" text,
|
|
26
|
+
"color" "my_schema"."colors" DEFAULT 'red'
|
|
27
|
+
);
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### MySQL
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
import { int, text, mysqlSchema } from "drizzle-orm/mysql-core";
|
|
34
|
+
|
|
35
|
+
export const mySchema = mysqlSchema("my_schema");
|
|
36
|
+
export const mySchemaUsers = mySchema.table("users", {
|
|
37
|
+
id: int("id").primaryKey().autoincrement(),
|
|
38
|
+
name: text("name"),
|
|
39
|
+
});
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Generates:
|
|
43
|
+
```sql
|
|
44
|
+
CREATE SCHEMA "my_schema";
|
|
45
|
+
CREATE TABLE "my_schema"."users" (
|
|
46
|
+
"id" serial PRIMARY KEY,
|
|
47
|
+
"name" text
|
|
48
|
+
);
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### SingleStore
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
import { int, text, singlestoreSchema } from "drizzle-orm/singlestore-core";
|
|
55
|
+
|
|
56
|
+
export const mySchema = singlestoreSchema("my_schema");
|
|
57
|
+
export const mySchemaUsers = mySchema.table("users", {
|
|
58
|
+
id: int("id").primaryKey().autoincrement(),
|
|
59
|
+
name: text("name"),
|
|
60
|
+
});
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Generates the same SQL as MySQL variant.
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
## Seed Generators Reference
|
|
2
|
+
|
|
3
|
+
Generators are functions used with `drizzle-seed` to create test data. All generators support `arraySize` parameter to generate arrays of values.
|
|
4
|
+
|
|
5
|
+
**Warning**: Using `arraySize` with `isUnique` generates unique individual values packed into arrays, not unique arrays.
|
|
6
|
+
|
|
7
|
+
### Basic Generators
|
|
8
|
+
|
|
9
|
+
**`default(defaultValue, arraySize)`** - Returns the same value each time.
|
|
10
|
+
```ts
|
|
11
|
+
funcs.default({ defaultValue: "post content", arraySize: 3 })
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
**`valuesFromArray(values, isUnique, arraySize)`** - Picks from given array. Values can be weighted: `{ weight: number; values: any[] }[]`
|
|
15
|
+
```ts
|
|
16
|
+
funcs.valuesFromArray({
|
|
17
|
+
values: ["Title1", "Title2", "Title3"],
|
|
18
|
+
isUnique: true,
|
|
19
|
+
arraySize: 3
|
|
20
|
+
})
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**`intPrimaryKey()`** - Sequential integers starting from 1.
|
|
24
|
+
```ts
|
|
25
|
+
funcs.intPrimaryKey()
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Numeric Generators
|
|
29
|
+
|
|
30
|
+
**`number(minValue, maxValue, precision, isUnique, arraySize)`** - Floating point numbers.
|
|
31
|
+
- `precision`: 10 = 0.1 accuracy, 100 = 0.01 accuracy
|
|
32
|
+
- Default `maxValue`: `precision * 1000` (non-unique) or `precision * count` (unique)
|
|
33
|
+
- Default `minValue`: `-maxValue`
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
funcs.number({ minValue: 10, maxValue: 120, precision: 100, isUnique: false, arraySize: 3 })
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**`int(minValue, maxValue, isUnique, arraySize)`** - Integers in range.
|
|
40
|
+
- Default `maxValue`: `1000` (non-unique) or `count * 10` (unique)
|
|
41
|
+
- Default `minValue`: `-maxValue`
|
|
42
|
+
|
|
43
|
+
```ts
|
|
44
|
+
funcs.int({ minValue: 0, maxValue: 100, isUnique: false, arraySize: 3 })
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Boolean & Temporal Generators
|
|
48
|
+
|
|
49
|
+
**`boolean(arraySize)`** - True or false values.
|
|
50
|
+
```ts
|
|
51
|
+
funcs.boolean({ arraySize: 3 })
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**`date(minDate, maxDate, arraySize)`** - Dates in range.
|
|
55
|
+
- Defaults: `minDate: '2020-05-08'`, `maxDate: '2028-05-08'`
|
|
56
|
+
- If only one date provided, the other is calculated by ±8 years
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
funcs.date({ minDate: "1990-01-01", maxDate: "2010-12-31", arraySize: 3 })
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**`time(arraySize)`** - 24-hour format time.
|
|
63
|
+
```ts
|
|
64
|
+
funcs.time({ arraySize: 3 })
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**`timestamp(arraySize)`** - Timestamps.
|
|
68
|
+
```ts
|
|
69
|
+
funcs.timestamp({ arraySize: 3 })
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**`datetime(arraySize)`** - Datetime objects.
|
|
73
|
+
```ts
|
|
74
|
+
funcs.datetime({ arraySize: 3 })
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**`year(arraySize)`** - Years in YYYY format.
|
|
78
|
+
```ts
|
|
79
|
+
funcs.year({ arraySize: 3 })
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**`interval(isUnique, arraySize)`** - Time intervals (e.g., "1 year 12 days 5 minutes").
|
|
83
|
+
```ts
|
|
84
|
+
funcs.interval({ isUnique: true, arraySize: 3 })
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Data Type Generators
|
|
88
|
+
|
|
89
|
+
**`json(arraySize)`** - JSON objects with random structure containing: email, name, isGraduated, hasJob, salary, startedWorking, visitedCountries (structure picked randomly).
|
|
90
|
+
```ts
|
|
91
|
+
funcs.json({ arraySize: 3 })
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**`string(isUnique, arraySize)`** - Random strings.
|
|
95
|
+
```ts
|
|
96
|
+
funcs.string({ isUnique: false, arraySize: 3 })
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**`uuid(arraySize)`** - v4 UUID strings.
|
|
100
|
+
```ts
|
|
101
|
+
funcs.uuid({ arraySize: 3 })
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Person & Location Generators
|
|
105
|
+
|
|
106
|
+
**`firstName(isUnique, arraySize)`** - Person's first name.
|
|
107
|
+
```ts
|
|
108
|
+
funcs.firstName({ isUnique: true, arraySize: 3 })
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**`lastName(isUnique, arraySize)`** - Person's last name.
|
|
112
|
+
```ts
|
|
113
|
+
funcs.lastName({ isUnique: false, arraySize: 3 })
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**`fullName(isUnique, arraySize)`** - Person's full name.
|
|
117
|
+
```ts
|
|
118
|
+
funcs.fullName({ isUnique: true, arraySize: 3 })
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**`email(arraySize)`** - Unique email addresses.
|
|
122
|
+
```ts
|
|
123
|
+
funcs.email({ arraySize: 3 })
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**`phoneNumber(template | prefixes, generatedDigitsNumbers, arraySize)`** - Unique phone numbers.
|
|
127
|
+
- Template mode: `template: "+(380) ###-####"` (# replaced with digits)
|
|
128
|
+
- Prefix mode: `prefixes: ["+380 99", "+380 67"]`, `generatedDigitsNumbers: 7` or `[7, 7, 10]` per prefix
|
|
129
|
+
|
|
130
|
+
```ts
|
|
131
|
+
funcs.phoneNumber({ template: "+(380) ###-####", arraySize: 3 })
|
|
132
|
+
funcs.phoneNumber({ prefixes: ["+380 99", "+380 67"], generatedDigitsNumbers: 7, arraySize: 3 })
|
|
133
|
+
funcs.phoneNumber({ prefixes: ["+380 99", "+380 67", "+1"], generatedDigitsNumbers: [7, 7, 10], arraySize: 3 })
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**`country(isUnique, arraySize)`** - Country names.
|
|
137
|
+
```ts
|
|
138
|
+
funcs.country({ isUnique: false, arraySize: 3 })
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**`city(isUnique, arraySize)`** - City names.
|
|
142
|
+
```ts
|
|
143
|
+
funcs.city({ isUnique: false, arraySize: 3 })
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**`streetAddress(isUnique, arraySize)`** - Street addresses.
|
|
147
|
+
```ts
|
|
148
|
+
funcs.streetAddress({ isUnique: false, arraySize: 3 })
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**`postcode(isUnique, arraySize)`** - Postal codes.
|
|
152
|
+
```ts
|
|
153
|
+
funcs.postcode({ isUnique: true, arraySize: 3 })
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
**`state(arraySize)`** - US states.
|
|
157
|
+
```ts
|
|
158
|
+
funcs.state({ arraySize: 3 })
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Business & Content Generators
|
|
162
|
+
|
|
163
|
+
**`jobTitle(arraySize)`** - Job titles.
|
|
164
|
+
```ts
|
|
165
|
+
funcs.jobTitle({ arraySize: 3 })
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
**`companyName(isUnique, arraySize)`** - Company names.
|
|
169
|
+
```ts
|
|
170
|
+
funcs.companyName({ isUnique: true, arraySize: 3 })
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**`loremIpsum(sentencesCount, arraySize)`** - Lorem ipsum text.
|
|
174
|
+
- Default `sentencesCount`: 1
|
|
175
|
+
|
|
176
|
+
```ts
|
|
177
|
+
funcs.loremIpsum({ sentencesCount: 2, arraySize: 3 })
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Geometric Generators
|
|
181
|
+
|
|
182
|
+
**`point(minXValue, maxXValue, minYValue, maxYValue, isUnique, arraySize)`** - 2D points.
|
|
183
|
+
- Default `maxXValue`/`maxYValue`: `10 * 1000` (non-unique) or `10 * count` (unique)
|
|
184
|
+
- Default `minXValue`/`minYValue`: `-maxXValue`/`-maxYValue`
|
|
185
|
+
|
|
186
|
+
```ts
|
|
187
|
+
funcs.point({
|
|
188
|
+
minXValue: -5, maxXValue: 20,
|
|
189
|
+
minYValue: 0, maxYValue: 30,
|
|
190
|
+
isUnique: true, arraySize: 3
|
|
191
|
+
})
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
**`line(minAValue, maxAValue, minBValue, maxBValue, minCValue, maxCValue, isUnique, arraySize)`** - 2D lines (equation: a*x + b*y + c = 0).
|
|
195
|
+
- Default ranges: `10 * 1000` (non-unique) or `10 * count` (unique)
|
|
196
|
+
- Default min values: `-max` values
|
|
197
|
+
|
|
198
|
+
```ts
|
|
199
|
+
funcs.line({
|
|
200
|
+
minAValue: -5, maxAValue: 20,
|
|
201
|
+
minBValue: 0, maxBValue: 30,
|
|
202
|
+
minCValue: 0, maxCValue: 10,
|
|
203
|
+
isUnique: true, arraySize: 3
|
|
204
|
+
})
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Usage Pattern
|
|
208
|
+
|
|
209
|
+
All generators are used within `seed()` refine callback:
|
|
210
|
+
```ts
|
|
211
|
+
import { seed } from "drizzle-seed";
|
|
212
|
+
|
|
213
|
+
await seed(db, schema, { count: 1000 }).refine((funcs) => ({
|
|
214
|
+
tableName: {
|
|
215
|
+
columns: {
|
|
216
|
+
columnName: funcs.generatorName({ /* options */ }),
|
|
217
|
+
},
|
|
218
|
+
},
|
|
219
|
+
}));
|
|
220
|
+
```
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
Type limitations for the third parameter in seed operations.
|
|
2
|
+
|
|
3
|
+
The page documents constraints and type-related issues that developers may encounter when working with the third parameter of seeding functions in drizzle-orm. This covers type inference limitations, type safety concerns, and potential workarounds when the type system cannot properly infer or validate the third parameter.
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
## Drizzle Seed
|
|
2
|
+
|
|
3
|
+
TypeScript library for generating deterministic, realistic fake data using a seedable pseudorandom number generator (pRNG). Same seed always produces identical data, enabling reproducible testing and debugging.
|
|
4
|
+
|
|
5
|
+
**Supported databases:** PostgreSQL, SQLite, MySQL (not SingleStore)
|
|
6
|
+
|
|
7
|
+
**Requirements:** drizzle-orm@0.36.4 or higher
|
|
8
|
+
|
|
9
|
+
### Installation
|
|
10
|
+
```
|
|
11
|
+
npm install drizzle-seed
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
### Basic Usage
|
|
15
|
+
```ts
|
|
16
|
+
import { pgTable, integer, text } from "drizzle-orm/pg-core";
|
|
17
|
+
import { drizzle } from "drizzle-orm/node-postgres";
|
|
18
|
+
import { seed } from "drizzle-seed";
|
|
19
|
+
|
|
20
|
+
const users = pgTable("users", {
|
|
21
|
+
id: integer().primaryKey(),
|
|
22
|
+
name: text().notNull(),
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const db = drizzle(process.env.DATABASE_URL!);
|
|
26
|
+
await seed(db, { users }); // Creates 10 users by default
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Options
|
|
30
|
+
|
|
31
|
+
**`count`** - Number of entities to create (default: 10)
|
|
32
|
+
```ts
|
|
33
|
+
await seed(db, schema, { count: 1000 });
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**`seed`** - Seed number for pRNG (different numbers generate different data)
|
|
37
|
+
```ts
|
|
38
|
+
await seed(db, schema, { seed: 12345 });
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Reset Database
|
|
42
|
+
```ts
|
|
43
|
+
import * as schema from "./schema.ts";
|
|
44
|
+
import { reset } from "drizzle-seed";
|
|
45
|
+
|
|
46
|
+
const db = drizzle(process.env.DATABASE_URL!);
|
|
47
|
+
await reset(db, schema);
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Reset strategies by dialect:
|
|
51
|
+
- **PostgreSQL:** `TRUNCATE tableName1, tableName2, ... CASCADE;`
|
|
52
|
+
- **MySQL:** Disables `FOREIGN_KEY_CHECKS`, runs `TRUNCATE` per table, re-enables checks
|
|
53
|
+
- **SQLite:** Disables `foreign_keys` pragma, runs `DELETE FROM` per table, re-enables pragma
|
|
54
|
+
|
|
55
|
+
### Refinements
|
|
56
|
+
|
|
57
|
+
Use `.refine()` callback to customize generation behavior:
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
await seed(db, schema).refine((f) => ({
|
|
61
|
+
users: {
|
|
62
|
+
columns: { name: f.fullName() },
|
|
63
|
+
count: 20
|
|
64
|
+
}
|
|
65
|
+
}));
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Refinement properties:
|
|
69
|
+
- **`columns`** - Override default generator for each column
|
|
70
|
+
- **`count`** - Rows to insert (overrides global count)
|
|
71
|
+
- **`with`** - Define related entities to create (one-to-many only)
|
|
72
|
+
|
|
73
|
+
**Example 1:** Seed users with custom name generation
|
|
74
|
+
```ts
|
|
75
|
+
await seed(db, { users: schema.users }).refine((f) => ({
|
|
76
|
+
users: {
|
|
77
|
+
columns: { name: f.fullName() },
|
|
78
|
+
count: 20
|
|
79
|
+
}
|
|
80
|
+
}));
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Example 2:** Seed users with 10 posts each
|
|
84
|
+
```ts
|
|
85
|
+
await seed(db, schema).refine((f) => ({
|
|
86
|
+
users: {
|
|
87
|
+
count: 20,
|
|
88
|
+
with: { posts: 10 }
|
|
89
|
+
}
|
|
90
|
+
}));
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Example 3:** Custom int range and array values
|
|
94
|
+
```ts
|
|
95
|
+
await seed(db, schema).refine((f) => ({
|
|
96
|
+
users: {
|
|
97
|
+
count: 5,
|
|
98
|
+
columns: {
|
|
99
|
+
id: f.int({ minValue: 10000, maxValue: 20000, isUnique: true })
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
posts: {
|
|
103
|
+
count: 100,
|
|
104
|
+
columns: {
|
|
105
|
+
description: f.valuesFromArray({
|
|
106
|
+
values: ["text1", "text2", "text3"]
|
|
107
|
+
})
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}));
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Weighted Random
|
|
114
|
+
|
|
115
|
+
Use weighted distributions for column values and related entity counts:
|
|
116
|
+
|
|
117
|
+
**Column values with weights:**
|
|
118
|
+
```ts
|
|
119
|
+
await seed(db, schema).refine((f) => ({
|
|
120
|
+
orders: {
|
|
121
|
+
count: 5000,
|
|
122
|
+
columns: {
|
|
123
|
+
unitPrice: f.weightedRandom([
|
|
124
|
+
{ weight: 0.3, value: f.int({ minValue: 10, maxValue: 100 }) },
|
|
125
|
+
{ weight: 0.7, value: f.number({ minValue: 100, maxValue: 300, precision: 100 }) }
|
|
126
|
+
])
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}));
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**Related entity counts with weights:**
|
|
133
|
+
```ts
|
|
134
|
+
await seed(db, schema).refine((f) => ({
|
|
135
|
+
orders: {
|
|
136
|
+
with: {
|
|
137
|
+
details: [
|
|
138
|
+
{ weight: 0.6, count: [1, 2, 3] },
|
|
139
|
+
{ weight: 0.3, count: [5, 6, 7] },
|
|
140
|
+
{ weight: 0.1, count: [8, 9, 10] }
|
|
141
|
+
]
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}));
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Complex Example
|
|
148
|
+
|
|
149
|
+
Full e-commerce schema with 10,000 customers, 200 employees, 50,000 orders with weighted detail counts, 1,000 suppliers, 5,000 products with weighted pricing, and order details with weighted discounts. Uses generators: `companyName()`, `fullName()`, `jobTitle()`, `streetAddress()`, `city()`, `postcode()`, `state()`, `country()`, `phoneNumber()`, `date()`, `int()`, `number()`, `loremIpsum()`, `valuesFromArray()`, `weightedRandom()`, `default()`.
|
|
150
|
+
|
|
151
|
+
### Limitations
|
|
152
|
+
|
|
153
|
+
- **`with` type inference:** TypeScript cannot properly infer table references with circular dependencies. The `with` option displays all tables; manually select the one with one-to-many relationship.
|
|
154
|
+
- **`with` supports one-to-many only:** Can use `users with posts` but not `posts with users`.
|
|
155
|
+
- **Third parameter in Drizzle tables:** No type support (works at runtime only).
|