@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,220 @@
|
|
|
1
|
+
## Using Drizzle ORM with Vercel Edge Functions
|
|
2
|
+
|
|
3
|
+
This tutorial covers integrating Drizzle ORM with Vercel Functions running in Edge runtime. Edge runtime has limitations compared to Node.js, so edge-compatible drivers are required.
|
|
4
|
+
|
|
5
|
+
### Prerequisites
|
|
6
|
+
- Vercel CLI installed
|
|
7
|
+
- Existing Next.js project (or create with `npx create-next-app@latest --typescript`)
|
|
8
|
+
- Drizzle ORM and Drizzle Kit installed (`npm install drizzle-orm -D drizzle-kit`)
|
|
9
|
+
|
|
10
|
+
### Edge-Compatible Drivers
|
|
11
|
+
Choose a driver based on your database:
|
|
12
|
+
- **Neon serverless driver**: For Neon Postgres (HTTP/WebSocket instead of TCP)
|
|
13
|
+
- **Vercel Postgres driver**: Built on Neon serverless driver, for Vercel Postgres
|
|
14
|
+
- **PlanetScale serverless driver**: For MySQL over HTTP
|
|
15
|
+
- **libSQL client**: For Turso database
|
|
16
|
+
|
|
17
|
+
### Neon Postgres Setup
|
|
18
|
+
|
|
19
|
+
1. Install driver: `npm install @neondatabase/serverless`
|
|
20
|
+
|
|
21
|
+
2. Create schema in `src/db/schema.ts`:
|
|
22
|
+
```typescript
|
|
23
|
+
import { pgTable, serial, text } from "drizzle-orm/pg-core";
|
|
24
|
+
|
|
25
|
+
export const usersTable = pgTable('users_table', {
|
|
26
|
+
id: serial('id').primaryKey(),
|
|
27
|
+
name: text('name').notNull(),
|
|
28
|
+
age: text('age').notNull(),
|
|
29
|
+
email: text('email').notNull().unique(),
|
|
30
|
+
})
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
3. Create `drizzle.config.ts`:
|
|
34
|
+
```typescript
|
|
35
|
+
import { defineConfig } from "drizzle-kit";
|
|
36
|
+
|
|
37
|
+
export default defineConfig({
|
|
38
|
+
schema: "./src/db/schema.ts",
|
|
39
|
+
dialect: "postgresql",
|
|
40
|
+
dbCredentials: {
|
|
41
|
+
url: process.env.POSTGRES_URL!,
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
4. Set `.env`:
|
|
47
|
+
```
|
|
48
|
+
POSTGRES_URL="postgres://[user]:[password]@[host]-[region].aws.neon.tech:5432/[db-name]?sslmode=[ssl-mode]"
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
5. Generate and run migrations:
|
|
52
|
+
```bash
|
|
53
|
+
npx drizzle-kit generate
|
|
54
|
+
npx drizzle-kit migrate
|
|
55
|
+
# Or use push for quick prototyping:
|
|
56
|
+
npx drizzle-kit push
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
6. Connect in `src/db/index.ts`:
|
|
60
|
+
```typescript
|
|
61
|
+
import { drizzle } from 'drizzle-orm/neon-serverless';
|
|
62
|
+
export const db = drizzle(process.env.POSTGRES_URL!)
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
7. Create API route in `src/app/api/hello/route.ts`:
|
|
66
|
+
```typescript
|
|
67
|
+
import { db } from "@/db";
|
|
68
|
+
import { usersTable } from "@/db/schema";
|
|
69
|
+
import { NextResponse } from "next/server";
|
|
70
|
+
|
|
71
|
+
export const dynamic = 'force-dynamic';
|
|
72
|
+
export const runtime = 'edge'
|
|
73
|
+
|
|
74
|
+
export async function GET(request: Request) {
|
|
75
|
+
const users = await db.select().from(usersTable)
|
|
76
|
+
return NextResponse.json({ users, message: 'success' });
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
8. Test locally: `npx next dev` then navigate to `/api/hello`
|
|
81
|
+
|
|
82
|
+
9. Deploy: `vercel` then `vercel env add POSTGRES_URL` then `vercel` again
|
|
83
|
+
|
|
84
|
+
### Vercel Postgres Setup
|
|
85
|
+
|
|
86
|
+
1. Install: `npm install @vercel/postgres`
|
|
87
|
+
|
|
88
|
+
2. Schema and config identical to Neon (same PostgreSQL dialect)
|
|
89
|
+
|
|
90
|
+
3. Connect in `src/db/index.ts`:
|
|
91
|
+
```typescript
|
|
92
|
+
import { drizzle } from 'drizzle-orm/vercel-postgres';
|
|
93
|
+
export const db = drizzle()
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
4. API route, testing, and deployment same as Neon
|
|
97
|
+
|
|
98
|
+
### PlanetScale (MySQL) Setup
|
|
99
|
+
|
|
100
|
+
1. Install: `npm install @planetscale/database`
|
|
101
|
+
|
|
102
|
+
2. Create schema in `src/db/schema.ts`:
|
|
103
|
+
```typescript
|
|
104
|
+
import { mysqlTable, serial, text } from "drizzle-orm/mysql-core";
|
|
105
|
+
|
|
106
|
+
export const usersTable = mysqlTable('users_table', {
|
|
107
|
+
id: serial('id').primaryKey(),
|
|
108
|
+
name: text('name').notNull(),
|
|
109
|
+
age: text('age').notNull(),
|
|
110
|
+
email: text('email').notNull().unique(),
|
|
111
|
+
})
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
3. Create `drizzle.config.ts`:
|
|
115
|
+
```typescript
|
|
116
|
+
import { defineConfig } from "drizzle-kit";
|
|
117
|
+
|
|
118
|
+
export default defineConfig({
|
|
119
|
+
schema: "./src/db/schema.ts",
|
|
120
|
+
dialect: "mysql",
|
|
121
|
+
dbCredentials: {
|
|
122
|
+
url: process.env.MYSQL_URL!,
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
4. Set `.env`:
|
|
128
|
+
```
|
|
129
|
+
MYSQL_URL="mysql://[user]:[password]@[host].[region].psdb.cloud/[db-name]?ssl={'rejectUnauthorized':[ssl-rejectUnauthorized]}"
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
5. Generate and run migrations: `npx drizzle-kit generate` then `npx drizzle-kit migrate`
|
|
133
|
+
|
|
134
|
+
6. Connect in `src/db/index.ts`:
|
|
135
|
+
```typescript
|
|
136
|
+
import { drizzle } from "drizzle-orm/planetscale-serverless";
|
|
137
|
+
export const db = drizzle(process.env.MYSQL_URL!)
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
7. API route in `src/app/api/hello/route.ts`:
|
|
141
|
+
```typescript
|
|
142
|
+
import { db } from "@/app/db/db";
|
|
143
|
+
import { usersTable } from "@/app/db/schema";
|
|
144
|
+
import { NextResponse } from "next/server";
|
|
145
|
+
|
|
146
|
+
export const dynamic = 'force-dynamic';
|
|
147
|
+
export const runtime = 'edge'
|
|
148
|
+
|
|
149
|
+
export async function GET(request: Request) {
|
|
150
|
+
const users = await db.select().from(usersTable)
|
|
151
|
+
return NextResponse.json({ users, message: 'success' });
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
8. Test and deploy same as Neon, but use `vercel env add MYSQL_URL`
|
|
156
|
+
|
|
157
|
+
### Turso (SQLite) Setup
|
|
158
|
+
|
|
159
|
+
1. Install: `npm install @libsql/client`
|
|
160
|
+
|
|
161
|
+
2. Create schema in `src/db/schema.ts`:
|
|
162
|
+
```typescript
|
|
163
|
+
import { integer, sqliteTable, text } from "drizzle-orm/sqlite-core";
|
|
164
|
+
|
|
165
|
+
export const usersTable = sqliteTable('users_table', {
|
|
166
|
+
id: integer('id').primaryKey(),
|
|
167
|
+
name: text('name').notNull(),
|
|
168
|
+
age: text('age').notNull(),
|
|
169
|
+
email: text('email').notNull().unique(),
|
|
170
|
+
})
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
3. Create `drizzle.config.ts`:
|
|
174
|
+
```typescript
|
|
175
|
+
import { defineConfig } from "drizzle-kit";
|
|
176
|
+
|
|
177
|
+
export default defineConfig({
|
|
178
|
+
schema: "./src/db/schema.ts",
|
|
179
|
+
dialect: "turso",
|
|
180
|
+
dbCredentials: {
|
|
181
|
+
url: process.env.TURSO_CONNECTION_URL!,
|
|
182
|
+
authToken: process.env.TURSO_AUTH_TOKEN!,
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
4. Set `.env`:
|
|
188
|
+
```
|
|
189
|
+
TURSO_CONNECTION_URL="libsql://[db-name].turso.io"
|
|
190
|
+
TURSO_AUTH_TOKEN="[auth-token]"
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
5. Generate and run migrations: `npx drizzle-kit generate` then `npx drizzle-kit migrate`
|
|
194
|
+
|
|
195
|
+
6. Connect in `src/db/index.ts`:
|
|
196
|
+
```typescript
|
|
197
|
+
import { drizzle } from 'drizzle-orm/libsql';
|
|
198
|
+
|
|
199
|
+
export const db = drizzle({ connection: {
|
|
200
|
+
url: process.env.TURSO_CONNECTION_URL!,
|
|
201
|
+
authToken: process.env.TURSO_AUTH_TOKEN!,
|
|
202
|
+
}})
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
7. API route in `src/app/api/hello/route.ts`:
|
|
206
|
+
```typescript
|
|
207
|
+
import { db } from "@/app/db/db";
|
|
208
|
+
import { usersTable } from "@/app/db/schema";
|
|
209
|
+
import { NextResponse } from "next/server";
|
|
210
|
+
|
|
211
|
+
export const dynamic = 'force-dynamic';
|
|
212
|
+
export const runtime = 'edge'
|
|
213
|
+
|
|
214
|
+
export async function GET(request: Request) {
|
|
215
|
+
const users = await db.select().from(usersTable)
|
|
216
|
+
return NextResponse.json({ users, message: 'success' });
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
8. Test locally and deploy: `vercel` then `vercel env add TURSO_CONNECTION_URL` and `vercel env add TURSO_AUTH_TOKEN` then `vercel`
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
## Setup Overview
|
|
2
|
+
This tutorial integrates Drizzle ORM with Netlify Edge Functions and Neon Postgres database.
|
|
3
|
+
|
|
4
|
+
## Prerequisites
|
|
5
|
+
- Netlify CLI installed
|
|
6
|
+
- Drizzle ORM and Drizzle Kit: `npm install drizzle-orm -D drizzle-kit`
|
|
7
|
+
- dotenv package (or Node.js v20.6.0+): `npm install dotenv`
|
|
8
|
+
- Optional: `npm install @netlify/edge-functions` for Context types
|
|
9
|
+
|
|
10
|
+
Note: These packages are only for local development. Edge Functions use imports from `import_map.json`.
|
|
11
|
+
|
|
12
|
+
## Configuration Steps
|
|
13
|
+
|
|
14
|
+
**1. Neon Postgres Setup**
|
|
15
|
+
- Log into Neon Console and select/create a project
|
|
16
|
+
- Use the default `neondb` database
|
|
17
|
+
- Copy connection string from Connect button
|
|
18
|
+
|
|
19
|
+
**2. Environment Variables**
|
|
20
|
+
Add to `.env`:
|
|
21
|
+
```
|
|
22
|
+
DATABASE_URL=postgres://username:password@ep-cool-darkness-123456.us-east-2.aws.neon.tech/neondb?sslmode=require
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**3. Edge Function File Structure**
|
|
26
|
+
Create `netlify/edge-functions/user.ts`:
|
|
27
|
+
```typescript
|
|
28
|
+
import type { Context } from "@netlify/edge-functions";
|
|
29
|
+
|
|
30
|
+
export default async (request: Request, context: Context) => {
|
|
31
|
+
return new Response("User data");
|
|
32
|
+
};
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**4. Import Map**
|
|
36
|
+
Create `import_map.json` in project root:
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"imports": {
|
|
40
|
+
"drizzle-orm/": "https://esm.sh/drizzle-orm/",
|
|
41
|
+
"@neondatabase/serverless": "https://esm.sh/@neondatabase/serverless"
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**5. Netlify Configuration**
|
|
47
|
+
Create `netlify.toml`:
|
|
48
|
+
```toml
|
|
49
|
+
[functions]
|
|
50
|
+
deno_import_map = "./import_map.json"
|
|
51
|
+
|
|
52
|
+
[[edge_functions]]
|
|
53
|
+
path = "/user"
|
|
54
|
+
function = "user"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**6. Database Schema**
|
|
58
|
+
Create `netlify/edge-functions/common/schema.ts`:
|
|
59
|
+
```typescript
|
|
60
|
+
import { pgTable, serial, text, integer } from "drizzle-orm/pg-core";
|
|
61
|
+
|
|
62
|
+
export const usersTable = pgTable('users_table', {
|
|
63
|
+
id: serial('id').primaryKey(),
|
|
64
|
+
name: text('name').notNull(),
|
|
65
|
+
age: integer('age').notNull(),
|
|
66
|
+
email: text('email').notNull().unique(),
|
|
67
|
+
})
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**7. Drizzle Config**
|
|
71
|
+
Create `drizzle.config.ts`:
|
|
72
|
+
```typescript
|
|
73
|
+
import 'dotenv/config';
|
|
74
|
+
import type { Config } from "drizzle-kit";
|
|
75
|
+
|
|
76
|
+
export default {
|
|
77
|
+
schema: './netlify/edge-functions/common/schema.ts',
|
|
78
|
+
out: './drizzle',
|
|
79
|
+
dialect: 'postgresql',
|
|
80
|
+
dbCredentials: {
|
|
81
|
+
url: process.env.DATABASE_URL!,
|
|
82
|
+
},
|
|
83
|
+
} satisfies Config;
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**8. Apply Schema**
|
|
87
|
+
```bash
|
|
88
|
+
npx drizzle-kit push
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**9. Connect to Database in Edge Function**
|
|
92
|
+
Update `netlify/edge-functions/user.ts`:
|
|
93
|
+
```typescript
|
|
94
|
+
import type { Context } from "@netlify/edge-functions";
|
|
95
|
+
import { usersTable } from "./common/schema.ts";
|
|
96
|
+
import { neon } from '@neondatabase/serverless';
|
|
97
|
+
import { drizzle } from 'drizzle-orm/neon-http';
|
|
98
|
+
|
|
99
|
+
export default async (request: Request, context: Context) => {
|
|
100
|
+
const sql = neon(Netlify.env.get("DATABASE_URL")!);
|
|
101
|
+
const db = drizzle({ client: sql });
|
|
102
|
+
const users = await db.select().from(usersTable);
|
|
103
|
+
return new Response(JSON.stringify(users));
|
|
104
|
+
};
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Local Testing
|
|
108
|
+
```bash
|
|
109
|
+
netlify dev
|
|
110
|
+
```
|
|
111
|
+
Navigate to `/user` route. VS Code may show red underlines for imports despite correct execution; configure it when prompted or restart Deno Language Server.
|
|
112
|
+
|
|
113
|
+
## Deployment
|
|
114
|
+
```bash
|
|
115
|
+
netlify init
|
|
116
|
+
netlify env:import .env
|
|
117
|
+
netlify deploy
|
|
118
|
+
netlify deploy --prod # for production
|
|
119
|
+
```
|
|
120
|
+
Access deployed function at `https://<your-site>/user`
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
## Setup
|
|
2
|
+
|
|
3
|
+
Prerequisites: Netlify CLI, drizzle-orm, drizzle-kit, dotenv (or Node.js v20.6.0+), optionally @netlify/edge-functions for types.
|
|
4
|
+
|
|
5
|
+
Create Supabase project, get connection string from dashboard (Connect > Transaction pooler), add to `.env`:
|
|
6
|
+
```
|
|
7
|
+
DATABASE_URL=<YOUR_DATABASE_URL>
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Project Structure
|
|
11
|
+
|
|
12
|
+
Create `netlify/edge-functions/` directory for edge functions.
|
|
13
|
+
|
|
14
|
+
Create `import_map.json` in project root:
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"imports": {
|
|
18
|
+
"drizzle-orm/": "https://esm.sh/drizzle-orm/",
|
|
19
|
+
"postgres": "https://esm.sh/postgres"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Create `netlify.toml`:
|
|
25
|
+
```toml
|
|
26
|
+
[functions]
|
|
27
|
+
deno_import_map = "./import_map.json"
|
|
28
|
+
|
|
29
|
+
[[edge_functions]]
|
|
30
|
+
path = "/user"
|
|
31
|
+
function = "user"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Schema and Configuration
|
|
35
|
+
|
|
36
|
+
Create `netlify/edge-functions/common/schema.ts`:
|
|
37
|
+
```typescript
|
|
38
|
+
import { pgTable, serial, text, integer } from "drizzle-orm/pg-core";
|
|
39
|
+
|
|
40
|
+
export const usersTable = pgTable('users_table', {
|
|
41
|
+
id: serial('id').primaryKey(),
|
|
42
|
+
name: text('name').notNull(),
|
|
43
|
+
age: integer('age').notNull(),
|
|
44
|
+
email: text('email').notNull().unique(),
|
|
45
|
+
})
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Create `drizzle.config.ts` in project root:
|
|
49
|
+
```typescript
|
|
50
|
+
import 'dotenv/config';
|
|
51
|
+
import type { Config } from "drizzle-kit";
|
|
52
|
+
|
|
53
|
+
export default {
|
|
54
|
+
schema: './netlify/edge-functions/common/schema.ts',
|
|
55
|
+
out: './drizzle',
|
|
56
|
+
dialect: 'postgresql',
|
|
57
|
+
dbCredentials: {
|
|
58
|
+
url: process.env.DATABASE_URL!,
|
|
59
|
+
},
|
|
60
|
+
} satisfies Config;
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Apply schema: `npx drizzle-kit push`
|
|
64
|
+
|
|
65
|
+
## Edge Function
|
|
66
|
+
|
|
67
|
+
Create `netlify/edge-functions/user.ts`:
|
|
68
|
+
```typescript
|
|
69
|
+
import type { Context } from "@netlify/edge-functions";
|
|
70
|
+
import { usersTable } from "./common/schema.ts";
|
|
71
|
+
import { drizzle } from 'drizzle-orm/postgres-js';
|
|
72
|
+
import postgres from 'postgres';
|
|
73
|
+
|
|
74
|
+
export default async (request: Request, context: Context) => {
|
|
75
|
+
const queryClient = postgres(Netlify.env.get("DATABASE_URL")!);
|
|
76
|
+
const db = drizzle({ client: queryClient });
|
|
77
|
+
const users = await db.select().from(usersTable);
|
|
78
|
+
return new Response(JSON.stringify(users));
|
|
79
|
+
};
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Access environment variables via `Netlify.env.get()`. Request and Response types are global.
|
|
83
|
+
|
|
84
|
+
## Testing and Deployment
|
|
85
|
+
|
|
86
|
+
Local testing: `netlify dev` - navigate to `/user` route.
|
|
87
|
+
|
|
88
|
+
Initialize project: `netlify init`
|
|
89
|
+
|
|
90
|
+
Import env vars: `netlify env:import .env`
|
|
91
|
+
|
|
92
|
+
Deploy: `netlify deploy` (draft) or `netlify deploy --prod` (production)
|
|
93
|
+
|
|
94
|
+
Access deployed function at `<deployed-url>/user`
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
## Setup
|
|
2
|
+
|
|
3
|
+
Prerequisites: Supabase CLI, Drizzle ORM, Drizzle Kit, Docker Desktop.
|
|
4
|
+
|
|
5
|
+
## Schema Definition
|
|
6
|
+
|
|
7
|
+
Create `src/schema.ts`:
|
|
8
|
+
```typescript
|
|
9
|
+
import { pgTable, serial, text, integer } from "drizzle-orm/pg-core";
|
|
10
|
+
|
|
11
|
+
export const usersTable = pgTable('users_table', {
|
|
12
|
+
id: serial('id').primaryKey(),
|
|
13
|
+
name: text('name').notNull(),
|
|
14
|
+
age: integer('age').notNull()
|
|
15
|
+
})
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Configuration
|
|
19
|
+
|
|
20
|
+
Create `drizzle.config.ts`:
|
|
21
|
+
```typescript
|
|
22
|
+
import { defineConfig } from "drizzle-kit";
|
|
23
|
+
|
|
24
|
+
export default defineConfig({
|
|
25
|
+
schema: "./src/schema.ts",
|
|
26
|
+
out: "./supabase/migrations",
|
|
27
|
+
dialect: "postgresql",
|
|
28
|
+
});
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Project Initialization
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
supabase init
|
|
35
|
+
npx drizzle-kit generate
|
|
36
|
+
supabase start
|
|
37
|
+
supabase migration up
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Edge Function Setup
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
supabase functions new drizzle-tutorial
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Add to `supabase/functions/drizzle-tutorial/deno.json`:
|
|
47
|
+
```json
|
|
48
|
+
{
|
|
49
|
+
"imports": {
|
|
50
|
+
"drizzle-orm/": "npm:/drizzle-orm/",
|
|
51
|
+
"postgres": "npm:postgres"
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Database Connection
|
|
57
|
+
|
|
58
|
+
In `supabase/functions/drizzle-tutorial/index.ts`:
|
|
59
|
+
```typescript
|
|
60
|
+
import { integer, pgTable, serial, text } from "drizzle-orm/pg-core";
|
|
61
|
+
import { drizzle } from "drizzle-orm/postgres-js";
|
|
62
|
+
import "jsr:@supabase/functions-js/edge-runtime.d.ts";
|
|
63
|
+
import postgres from "postgres";
|
|
64
|
+
|
|
65
|
+
const usersTable = pgTable('users_table', {
|
|
66
|
+
id: serial('id').primaryKey(),
|
|
67
|
+
name: text('name').notNull(),
|
|
68
|
+
age: integer('age').notNull()
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
Deno.serve(async () => {
|
|
72
|
+
const connectionString = Deno.env.get("SUPABASE_DB_URL")!;
|
|
73
|
+
const client = postgres(connectionString, { prepare: false });
|
|
74
|
+
const db = drizzle({ client });
|
|
75
|
+
|
|
76
|
+
await db.insert(usersTable).values({
|
|
77
|
+
name: "Alice",
|
|
78
|
+
age: 25
|
|
79
|
+
})
|
|
80
|
+
const data = await db.select().from(usersTable);
|
|
81
|
+
|
|
82
|
+
return new Response(JSON.stringify(data))
|
|
83
|
+
})
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Note: Disable prefetch with `{ prepare: false }` for Transaction pool mode.
|
|
87
|
+
|
|
88
|
+
## Local Testing
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
supabase functions serve --no-verify-jwt
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Navigate to `/drizzle-tutorial` to see results.
|
|
95
|
+
|
|
96
|
+
## Deployment
|
|
97
|
+
|
|
98
|
+
Link to hosted project:
|
|
99
|
+
```bash
|
|
100
|
+
supabase link --project-ref=<REFERENCE_ID>
|
|
101
|
+
supabase db push
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Set environment variable (use Transaction pooler connection string):
|
|
105
|
+
```bash
|
|
106
|
+
supabase secrets set DATABASE_URL=<CONNECTION_STRING>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Update function to use `DATABASE_URL` instead of `SUPABASE_DB_URL`.
|
|
110
|
+
|
|
111
|
+
Deploy:
|
|
112
|
+
```bash
|
|
113
|
+
supabase functions deploy drizzle-tutorial --no-verify-jwt
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Each Edge Function is independent with its own `deno.json` and dependencies.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
## Edge Functions Integration with Drizzle ORM
|
|
2
|
+
|
|
3
|
+
Tutorials for integrating Drizzle ORM with serverless edge function platforms: Netlify Edge Functions, Supabase Edge Functions, and Vercel Edge Functions.
|
|
4
|
+
|
|
5
|
+
### Netlify Edge Functions
|
|
6
|
+
|
|
7
|
+
**With Neon Postgres:**
|
|
8
|
+
- Setup: Install drizzle-orm, drizzle-kit, dotenv
|
|
9
|
+
- Create `import_map.json` with ESM imports for drizzle-orm and @neondatabase/serverless
|
|
10
|
+
- Configure `netlify.toml` with deno_import_map and edge function paths
|
|
11
|
+
- Define schema in `netlify/edge-functions/common/schema.ts` using pgTable
|
|
12
|
+
- Create `drizzle.config.ts` pointing to schema with postgresql dialect
|
|
13
|
+
- Run `npx drizzle-kit push` to apply schema
|
|
14
|
+
- In edge function, connect via: `const sql = neon(Netlify.env.get("DATABASE_URL")!); const db = drizzle({ client: sql });`
|
|
15
|
+
- Deploy with `netlify init`, `netlify env:import .env`, `netlify deploy --prod`
|
|
16
|
+
|
|
17
|
+
**With Supabase:**
|
|
18
|
+
- Same setup as Neon but use postgres-js client instead
|
|
19
|
+
- `import_map.json` imports drizzle-orm and postgres from esm.sh
|
|
20
|
+
- Connect via: `const queryClient = postgres(Netlify.env.get("DATABASE_URL")!); const db = drizzle({ client: queryClient });`
|
|
21
|
+
- Access environment variables via `Netlify.env.get()`
|
|
22
|
+
|
|
23
|
+
### Supabase Edge Functions
|
|
24
|
+
|
|
25
|
+
- Prerequisites: Supabase CLI, Docker Desktop
|
|
26
|
+
- Schema in `src/schema.ts` using pgTable
|
|
27
|
+
- `drizzle.config.ts` with schema path and postgresql dialect
|
|
28
|
+
- Initialize: `supabase init`, `npx drizzle-kit generate`, `supabase start`, `supabase migration up`
|
|
29
|
+
- Create function: `supabase functions new function-name`
|
|
30
|
+
- Add `deno.json` with imports for drizzle-orm and postgres
|
|
31
|
+
- In function index.ts, connect via: `const client = postgres(Deno.env.get("SUPABASE_DB_URL")!); const db = drizzle({ client });`
|
|
32
|
+
- Use `{ prepare: false }` option for Transaction pool mode
|
|
33
|
+
- Local test: `supabase functions serve --no-verify-jwt`
|
|
34
|
+
- Deploy: `supabase link --project-ref=<ID>`, `supabase db push`, `supabase secrets set DATABASE_URL=<URL>`, `supabase functions deploy function-name --no-verify-jwt`
|
|
35
|
+
|
|
36
|
+
### Vercel Edge Functions
|
|
37
|
+
|
|
38
|
+
Requires edge-compatible drivers (no TCP connections). Choose based on database:
|
|
39
|
+
- Neon Postgres: @neondatabase/serverless
|
|
40
|
+
- Vercel Postgres: @vercel/postgres (built on Neon)
|
|
41
|
+
- PlanetScale MySQL: @planetscale/database
|
|
42
|
+
- Turso SQLite: @libsql/client
|
|
43
|
+
|
|
44
|
+
**Neon/Vercel Postgres Setup:**
|
|
45
|
+
- Schema in `src/db/schema.ts` using pgTable
|
|
46
|
+
- `drizzle.config.ts` with postgresql dialect and POSTGRES_URL credential
|
|
47
|
+
- Generate migrations: `npx drizzle-kit generate`, `npx drizzle-kit migrate` (or `push` for prototyping)
|
|
48
|
+
- Connect in `src/db/index.ts`: `import { drizzle } from 'drizzle-orm/neon-serverless'; export const db = drizzle(process.env.POSTGRES_URL!)`
|
|
49
|
+
- For Vercel Postgres: `import { drizzle } from 'drizzle-orm/vercel-postgres'; export const db = drizzle()`
|
|
50
|
+
- API route in `src/app/api/route.ts` with `export const runtime = 'edge'` and `export const dynamic = 'force-dynamic'`
|
|
51
|
+
- Deploy: `vercel`, `vercel env add POSTGRES_URL`, `vercel`
|
|
52
|
+
|
|
53
|
+
**PlanetScale MySQL Setup:**
|
|
54
|
+
- Schema using mysqlTable instead of pgTable
|
|
55
|
+
- `drizzle.config.ts` with mysql dialect and MYSQL_URL credential
|
|
56
|
+
- Connect: `import { drizzle } from "drizzle-orm/planetscale-serverless"; export const db = drizzle(process.env.MYSQL_URL!)`
|
|
57
|
+
- Deploy with `vercel env add MYSQL_URL`
|
|
58
|
+
|
|
59
|
+
**Turso SQLite Setup:**
|
|
60
|
+
- Schema using sqliteTable
|
|
61
|
+
- `drizzle.config.ts` with turso dialect, TURSO_CONNECTION_URL and TURSO_AUTH_TOKEN credentials
|
|
62
|
+
- Connect: `import { drizzle } from 'drizzle-orm/libsql'; export const db = drizzle({ connection: { url: process.env.TURSO_CONNECTION_URL!, authToken: process.env.TURSO_AUTH_TOKEN! }})`
|
|
63
|
+
- Deploy with `vercel env add TURSO_CONNECTION_URL` and `vercel env add TURSO_AUTH_TOKEN`
|