Set up Drizzle ORM with Cloudflare D1 database. Creates schema, migrations directory, and Drizzle config.
Sets up Drizzle ORM with Cloudflare D1 database for Workers projects.
/plugin marketplace add jezweb/claude-skills/plugin install jezweb-drizzle-orm-d1-skills-drizzle-orm-d1@jezweb/claude-skillsSet up Drizzle ORM with Cloudflare D1 database. Creates schema, migrations directory, and Drizzle config.
Follow these steps to add Drizzle ORM to an existing Cloudflare Workers project.
Verify the project has:
wrangler.jsonc with a D1 binding configuredtsconfig.json)If no D1 binding exists, inform user:
Run: npx wrangler d1 create <database-name>
Then add the binding to wrangler.jsonc
npm install drizzle-orm
npm install -D drizzle-kit better-sqlite3 @types/better-sqlite3
src/
└── db/
└── schema.ts
drizzle.config.ts
migrations/
Create src/db/schema.ts:
import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';
// Example users table - customize for your needs
export const users = sqliteTable('users', {
id: integer('id').primaryKey({ autoIncrement: true }),
email: text('email').notNull().unique(),
name: text('name'),
createdAt: integer('created_at', { mode: 'timestamp' }).$defaultFn(() => new Date()),
updatedAt: integer('updated_at', { mode: 'timestamp' }).$defaultFn(() => new Date()),
});
// Add more tables as needed
Create drizzle.config.ts:
import { defineConfig } from 'drizzle-kit';
export default defineConfig({
schema: './src/db/schema.ts',
out: './migrations',
dialect: 'sqlite',
driver: 'd1-http',
dbCredentials: {
accountId: process.env.CLOUDFLARE_ACCOUNT_ID!,
databaseId: process.env.CLOUDFLARE_DATABASE_ID!,
token: process.env.CLOUDFLARE_D1_TOKEN!,
},
});
Ensure D1 binding and migrations directory are configured:
{
"d1_databases": [{
"binding": "DB",
"database_name": "<database-name>",
"database_id": "<your-database-id>",
"migrations_dir": "./migrations"
}]
}
Create src/db/index.ts:
import { drizzle } from 'drizzle-orm/d1';
import * as schema from './schema';
export function createDb(d1: D1Database) {
return drizzle(d1, { schema });
}
export type Database = ReturnType<typeof createDb>;
export * from './schema';
{
"scripts": {
"db:generate": "drizzle-kit generate",
"db:migrate:local": "wrangler d1 migrations apply <database-name> --local",
"db:migrate:remote": "wrangler d1 migrations apply <database-name> --remote",
"db:studio": "drizzle-kit studio"
}
}
npm run db:generate
✅ Drizzle ORM configured for D1!
📁 Structure:
- src/db/schema.ts (Define your tables)
- src/db/index.ts (Database helper)
- drizzle.config.ts (Drizzle Kit config)
- migrations/ (SQL migrations)
🚀 Next steps:
1. Edit src/db/schema.ts to define your tables
2. npm run db:generate (Generate migrations)
3. npm run db:migrate:local (Apply to local)
4. npm run db:migrate:remote (Apply to production)
💡 Usage in Worker:
import { createDb } from './db';
const db = createDb(env.DB);
const users = await db.select().from(schema.users);
📚 Skill loaded: drizzle-orm-d1
- 12 common issues auto-prevented
- Use db.batch([]) for transactions (D1 doesn't support BEGIN)
mode: 'timestamp' with $defaultFn() for datesdb.batch([])./migrations in wrangler.jsonc