mcpField
D
drizzle-orm-d1

drizzle-orm-d1

github.com/secondsky数据与数据库240428 次安装5 周前更新
代码仓库

关于 drizzle-orm-d1

drizzle-orm-d1 是为使用 Drizzle ORM 和 Cloudflare D1 的开发者编写的技能,涵盖模式设计、查询、D1 迁移及故障排查,并附有示例、模板和参考资料。

主要功能

  1. 01配置适用于 D1 的 Drizzle Kit
  2. 02定义模式并推断 TypeScript 类型
  3. 03生成并应用迁移
  4. 04使用 D1 批处理操作
  5. 05排查常见 D1 错误

适用场景

  1. 01为使用 D1 的应用创建模式
  2. 02先在本地执行迁移,再部署到生产环境
  3. 03使用批处理写入,避免 SQL 事务
  4. 04诊断绑定或外键错误

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/secondsky/claude-skills --skill drizzle-orm-d1

安装后在 Claude Code 中输入/drizzle-orm-d1确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
common-errors.md
error-catalog.md
links-to-official-docs.md
migration-workflow.md
query-builder-api.md
schema-patterns.md
wrangler-setup.md
scripts/
check-versions.sh
templates/
basic-queries.ts
basic-schema.ts
client.ts
cloudflare-worker-integration.ts
drizzle.config.ts
package.json
prepared-statements.ts
relations-queries.ts
schema.ts
transactions.ts
templates/migrations/
0001_example.sql

详细介绍

适用于 Cloudflare D1 的 Drizzle ORM

状态:已可用于生产环境 ✅ 最近更新:2025-12-14 最新版本:[email protected],[email protected] 依赖项:cloudflare-d1、cloudflare-worker-base


快速开始(10 分钟)

1. 安装 Drizzle
bun add drizzle-orm drizzle-kit
2. 配置 Drizzle Kit

创建 drizzle.config.ts:

import { defineConfig } from 'drizzle-kit';

export default defineConfig({
  schema: './src/db/schema.ts',
  out: './migrations',
  dialect: 'sqlite',          // MANDATORY since drizzle-kit 0.21 (D1 = sqlite)
  driver: 'd1-http',          // D1 HTTP driver for remote migrations/Studio
  dbCredentials: {            // MANDATORY: drizzle-kit 0.30+ tightened zod validation
    accountId: process.env.CLOUDFLARE_ACCOUNT_ID!,
    databaseId: process.env.CLOUDFLARE_DATABASE_ID!,
    token: process.env.CLOUDFLARE_D1_TOKEN!,
  },
});

drizzle-kit 0.30/0.31 注意事项:现在会严格验证 dialect 和 dbCredentials。如果配置中省略 dialect,或使用旧的 connectionString/uri 键,将无法通过验证。对于 D1,请使用 dialect: 'sqlite' + driver: 'd1-http',并配置 accountId/databaseId/token(或基于 wrangler 的凭据)。drizzle-orm/<driver>/migrator 中运行时 migrate() 的签名从 0.36 到 0.45 保持不变(仅在 1.0-beta 中更改,不在 ^0.45 的范围内)。

3. 定义架构

创建 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),
}));
4. 生成并应用迁移
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
5. 在 Worker 中查询
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 TRANSACTIOND1 要求使用 batch API(错误 #1)
混用 drizzle-kit migrate 和 wrangler apply只使用 Wrangler
在生产环境使用 drizzle-kit push使用 generate + apply
将凭据提交到 drizzle.config.ts使用环境变量
对函数调用使用 .default()改用 .$defaultFn()

最常见的 5 个严重错误

#错误解决方案
1D1_ERROR: Cannot use BEGIN TRANSACTION使用 db.batch([...]),不要使用 db.transaction()
2FOREIGN KEY constraint failed定义级联操作:.references(() => users.id, { onDelete: 'cascade' })
3env.DB is undefined确保 wrangler.jsonc 中的绑定与 env.DB 一致
4No such module "wrangler"使用 import { drizzle } from 'drizzle-orm/d1'
5Type 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
架构设计命名、索引、软删除references/schema-patterns.md

配置摘要

文件用途模板
drizzle.config.tsDrizzle Kit 配置templates/drizzle.config.ts
wrangler.jsoncD1 绑定设置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"
}

迁移工作流

步骤命令备注
1. 编辑架构编辑 src/db/schema.ts进行更改
2. 生成npm run db:generate创建 SQL 迁移
3. 本地测试npm run db:migrate:local在本地验证
4. 部署代码npm run deploy推送到 Cloudflare
5. 应用到生产环境npm run db:migrate:remote应用迁移

参见:references/migration-workflow.md,了解完整工作流。


TypeScript 类型推断

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设计架构、命名约定、索引、软删除时
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.45.2"
  },
  "devDependencies": {
    "drizzle-kit": "^0.31.10"
  }
}

安全安装

安装 Drizzle ORM 和 D1 驱动程序包时,请遵循供应链安全最佳实践:

  • 阻止安装后脚本 — npm config set ignore-scripts true(或 Bun:默认禁用)
  • 冷却期 — 等待 7 天,让社区审核新版本的软件包
  • 安装前审计 — 运行 socket package score npm <pkg>,或使用 socket npm install <pkg> 检查软件包

加载 dependency-upgrade 技能,获取完整的安全配置,包括 Socket CLI 集成、冷却期设置、锁文件验证和 CI 强制执行。

官方文档


Token 节省:约 65%(参考资料中包含全面的模式) 错误预防:100%(涵盖全部 12 个已记录问题) 已可投入生产! ✅

评论

支持 Markdown