重要前提
安装AI Skills的关键前提是:必须科学上网,且开启TUN模式,这一点至关重要,直接决定安装能否顺利完成,在此郑重提醒三遍:科学上网,科学上网,科学上网。查看完整安装教程 →
drizzle-orm-d1 by secondsky/claude-skills
npx skills add https://github.com/secondsky/claude-skills --skill drizzle-orm-d1状态 : 生产就绪 ✅ 最后更新 : 2025-12-14 最新版本 : drizzle-orm@0.44.7, drizzle-kit@0.31.7 依赖项 : cloudflare-d1, cloudflare-worker-base
bun add drizzle-orm drizzle-kit
创建 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!,
},
});
创建 src/db/schema.ts:
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';
import { relations } from 'drizzle-orm';
export const users = sqliteTable('users', {
id: integer('id').primaryKey({ autoIncrement: true }),
email: text('email').notNull().unique(),
name: text('name').notNull(),
createdAt: integer('created_at', { mode: 'timestamp' }).$defaultFn(() => new Date()),
});
export const posts = sqliteTable('posts', {
id: integer('id').primaryKey({ autoIncrement: true }),
title: text('title').notNull(),
content: text('content').notNull(),
authorId: integer('author_id')
.notNull()
.references(() => users.id, { onDelete: 'cascade' }),
});
export const usersRelations = relations(users, ({ many }) => ({
posts: many(posts),
}));
bunx drizzle-kit generate # 生成 SQL
bunx wrangler d1 migrations apply my-database --local # 本地应用
bunx wrangler d1 migrations apply my-database --remote # 生产环境应用
import { drizzle } from 'drizzle-orm/d1';
import { users } from './db/schema';
import { eq } from 'drizzle-orm';
export default {
async fetch(request: Request, env: { DB: D1Database }): Promise<Response> {
const db = drizzle(env.DB);
const allUsers = await db.select().from(users).all();
return Response.json(allUsers);
},
};
| 规则 | 原因 |
|---|---|
使用 drizzle-kit generate 进行迁移 | 切勿手动编写 SQL |
| 先在本地测试迁移 | 先 --local 再 --remote |
使用 .get() 获取单个结果 | 返回第一行或 undefined |
使用 db.batch() 进行事务处理 | D1 不支持 SQL BEGIN/COMMIT |
使用 integer 配合 mode: 'timestamp' 处理日期 | D1 没有原生日期类型 |
使用 .$defaultFn() 设置动态默认值 | 对于函数,不要使用 .default() |
| 规则 | 原因 |
|---|---|
使用 SQL BEGIN TRANSACTION | D1 要求使用 batch API (错误 #1) |
混合使用 drizzle-kit migrate 和 wrangler apply | 仅使用 Wrangler |
在生产环境中使用 drizzle-kit push | 使用 generate + apply |
| 在 drizzle.config.ts 中提交凭据 | 使用环境变量 |
使用 .default() 调用函数 | 改用 .$defaultFn() |
---|---|---
1 | D1_ERROR: Cannot use BEGIN TRANSACTION | 使用 db.batch([...]) 替代 db.transaction()
2 | FOREIGN KEY constraint failed | 定义级联操作: .references(() => users.id, { onDelete: 'cascade' })
3 | env.DB is undefined | 确保 wrangler.jsonc 中的绑定与 env.DB 匹配
4 | No such module "wrangler" | 使用 import { drizzle } from 'drizzle-orm/d1'
5 | Type instantiation excessively deep | 使用 InferSelectModel<typeof users> 获取显式类型
参见 : references/error-catalog.md 获取全部 12 个错误及其完整解决方案。
| 模式 | 使用场景 | 模板 |
|---|---|---|
| CRUD 操作 | 基础数据库操作 | templates/basic-queries.ts |
| 关系与连接 | 嵌套查询、手动连接 | templates/relations-queries.ts |
| 批量操作 | 事务处理 (D1 batch API) | templates/transactions.ts |
| Schema 设计 | 命名、索引、软删除 | references/schema-patterns.md |
| 文件 | 用途 | 模板 |
|---|---|---|
drizzle.config.ts | Drizzle Kit 配置 | templates/drizzle.config.ts |
wrangler.jsonc | D1 绑定设置 | references/wrangler-setup.md |
package.json | 用于迁移的 npm 脚本 | templates/package.json |
npm 脚本:
{
"db:generate": "drizzle-kit generate",
"db:migrate:local": "wrangler d1 migrations apply my-database --local",
"db:migrate:remote": "wrangler d1 migrations apply my-database --remote"
}
| 步骤 | 命令 | 备注 |
|---|
src/db/schema.ts | 进行更改npm run db:generate | 创建 SQL 迁移文件npm run db:migrate:local | 本地验证npm run deploy | 推送到 Cloudflarenpm run db:migrate:remote | 应用迁移参见 : references/migration-workflow.md 获取完整工作流。
import { InferSelectModel, InferInsertModel } from 'drizzle-orm';
import { users } from './db/schema';
export type User = InferSelectModel<typeof users>;
export type NewUser = InferInsertModel<typeof users>;
| 参考资料 | 查阅时机... |
|---|---|
references/error-catalog.md | 调试 D1 错误、事务失败、绑定问题 |
references/schema-patterns.md | 设计 schema、命名约定、索引、软删除 |
references/migration-workflow.md | 设置或排查迁移问题 |
references/query-builder-api.md | 复杂查询、操作符、连接语法 |
references/wrangler-setup.md | 为 D1 配置 wrangler.jsonc |
references/common-errors.md | 快速错误查找 |
模板 : basic-schema.ts, basic-queries.ts, transactions.ts, relations-queries.ts, prepared-statements.ts, drizzle.config.ts, package.json
参考资料 : error-catalog.md, schema-patterns.md, migration-workflow.md, query-builder-api.md, wrangler-setup.md, common-errors.md, links-to-official-docs.md
{
"dependencies": {
"drizzle-orm": "^0.44.7"
},
"devDependencies": {
"drizzle-kit": "^0.31.7"
}
}
Token 节省 : ~65% (参考资料中包含全面的模式) 错误预防 : 100% (所有 12 个已记录的问题) 已为生产环境做好准备! ✅
每周安装数
69
代码仓库
GitHub 星标数
90
首次出现
Jan 24, 2026
安全审计
安装于
claude-code59
gemini-cli56
cursor56
codex55
opencode54
github-copilot52
Status : Production Ready ✅ Last Updated : 2025-12-14 Latest Version : drizzle-orm@0.44.7, drizzle-kit@0.31.7 Dependencies : cloudflare-d1, cloudflare-worker-base
bun add drizzle-orm drizzle-kit
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!,
},
});
Create src/db/schema.ts:
import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';
import { relations } from 'drizzle-orm';
export const users = sqliteTable('users', {
id: integer('id').primaryKey({ autoIncrement: true }),
email: text('email').notNull().unique(),
name: text('name').notNull(),
createdAt: integer('created_at', { mode: 'timestamp' }).$defaultFn(() => new Date()),
});
export const posts = sqliteTable('posts', {
id: integer('id').primaryKey({ autoIncrement: true }),
title: text('title').notNull(),
content: text('content').notNull(),
authorId: integer('author_id')
.notNull()
.references(() => users.id, { onDelete: 'cascade' }),
});
export const usersRelations = relations(users, ({ many }) => ({
posts: many(posts),
}));
bunx drizzle-kit generate # Generate SQL
bunx wrangler d1 migrations apply my-database --local # Apply local
bunx wrangler d1 migrations apply my-database --remote # Apply prod
import { drizzle } from 'drizzle-orm/d1';
import { users } from './db/schema';
import { eq } from 'drizzle-orm';
export default {
async fetch(request: Request, env: { DB: D1Database }): Promise<Response> {
const db = drizzle(env.DB);
const allUsers = await db.select().from(users).all();
return Response.json(allUsers);
},
};
| Rule | Why |
|---|---|
Use drizzle-kit generate for migrations | Never write SQL manually |
| Test migrations locally first | --local before --remote |
Use .get() for single results | Returns first row or undefined |
Use db.batch() for transactions | D1 doesn't support SQL BEGIN/COMMIT |
Use integer with mode: 'timestamp' for dates |
| Rule | Why |
|---|---|
Use SQL BEGIN TRANSACTION | D1 requires batch API (Error #1) |
Mix drizzle-kit migrate and wrangler apply | Use Wrangler only |
Use drizzle-kit push for production | Use generate + apply |
| Commit credentials in drizzle.config.ts | Use env vars |
Use .default() for function calls |
---|---|---
1 | D1_ERROR: Cannot use BEGIN TRANSACTION | Use db.batch([...]) instead of db.transaction()
2 | FOREIGN KEY constraint failed | Define cascading: .references(() => users.id, { onDelete: 'cascade' })
3 | env.DB is undefined | Ensure binding in wrangler.jsonc matches env.DB
4 | No such module "wrangler" | Use import { drizzle } from 'drizzle-orm/d1'
5 | | Use for explicit types
See : references/error-catalog.md for all 12 errors with complete solutions.
| Pattern | Use Case | Template |
|---|---|---|
| CRUD Operations | Basic database operations | templates/basic-queries.ts |
| Relations & Joins | Nested queries, manual joins | templates/relations-queries.ts |
| Batch Operations | Transactions (D1 batch API) | templates/transactions.ts |
| Schema Design | Naming, indexes, soft deletes | references/schema-patterns.md |
| File | Purpose | Template |
|---|---|---|
drizzle.config.ts | Drizzle Kit configuration | templates/drizzle.config.ts |
wrangler.jsonc | D1 binding setup | references/wrangler-setup.md |
package.json | npm scripts for migrations | templates/package.json |
npm scripts:
{
"db:generate": "drizzle-kit generate",
"db:migrate:local": "wrangler d1 migrations apply my-database --local",
"db:migrate:remote": "wrangler d1 migrations apply my-database --remote"
}
| Step | Command | Notes |
|---|---|---|
| 1. Edit schema | Edit src/db/schema.ts | Make changes |
| 2. Generate | npm run db:generate | Creates SQL migration |
| 3. Test local | npm run db:migrate:local | Verify locally |
| 4. Deploy code | npm run deploy | Push to Cloudflare |
| 5. Apply prod | npm run db:migrate:remote |
See : references/migration-workflow.md for complete workflow.
import { InferSelectModel, InferInsertModel } from 'drizzle-orm';
import { users } from './db/schema';
export type User = InferSelectModel<typeof users>;
export type NewUser = InferInsertModel<typeof users>;
| Reference | Load When... |
|---|---|
references/error-catalog.md | Debugging D1 errors, transaction failures, binding issues |
references/schema-patterns.md | Designing schemas, naming conventions, indexes, soft deletes |
references/migration-workflow.md | Setting up or troubleshooting migrations |
references/query-builder-api.md | Complex queries, operators, joins syntax |
references/wrangler-setup.md | Configuring wrangler.jsonc for D1 |
references/common-errors.md |
Templates : basic-schema.ts, basic-queries.ts, transactions.ts, relations-queries.ts, prepared-statements.ts, drizzle.config.ts, package.json
References : error-catalog.md, schema-patterns.md, migration-workflow.md, query-builder-api.md, wrangler-setup.md, common-errors.md, links-to-official-docs.md
{
"dependencies": {
"drizzle-orm": "^0.44.7"
},
"devDependencies": {
"drizzle-kit": "^0.31.7"
}
}
Token Savings : ~65% (comprehensive patterns in references) Error Prevention : 100% (all 12 documented issues) Ready for production! ✅
Weekly Installs
69
Repository
GitHub Stars
90
First Seen
Jan 24, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
claude-code59
gemini-cli56
cursor56
codex55
opencode54
github-copilot52
| D1 has no native date type |
Use .$defaultFn() for dynamic defaults | Not .default() for functions |
Use .$defaultFn() instead |
Type instantiation excessively deepInferSelectModel<typeof users>| Apply migration |
| Quick error lookup |