mcpField
D
drizzle-orm

drizzle-orm

github.com/oakoss数据与数据库20242 次安装11 周前更新
代码仓库

关于 drizzle-orm

drizzle-orm 是面向 PostgreSQL、MySQL 和 SQLite 的轻量级类型安全 TypeScript ORM,适合需要编译期类型检查与 SQL 级控制的开发者。它同时提供类 SQL 查询构建器和关系查询 API。

主要功能

  1. 01类型安全的模式与类型推断
  2. 02类 SQL 查询构建器
  3. 03关系查询 API
  4. 04事务与预备语句
  5. 05生成和应用迁移

适用场景

  1. 01建模 PostgreSQL、MySQL 或 SQLite 数据
  2. 02编写具备 SQL 级控制的类型化查询
  3. 03通过事务组织关联数据库写入

安装

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

$npx skills add https://github.com/oakoss/agent-skills --skill drizzle-orm

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

包含的文件

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

references/
electric-integration.md
filters-and-operators.md
migrations.md
mutations.md
queries.md
relations.md
schema-definition.md
views-and-advanced.md

详细介绍

Drizzle ORM

概述

Drizzle ORM 是一款轻量、类型安全的 TypeScript ORM,可直接映射到 PostgreSQL、MySQL 和 SQLite 的 SQL。它提供类 SQL 查询构建器和关系查询 API,零依赖,并完全兼容无服务器环境。需要编译时类型安全和 SQL 级控制时,请使用 Drizzle;需要功能齐全、带自动迁移的 Active Record ORM 时(使用 Prisma),或使用 MongoDB/NoSQL 数据库时,请避免使用 Drizzle。

快速参考

模式API关键要点
Schema 定义pgTable('name', { columns }, (t) => [indexes])第三个参数返回索引/约束数组
列类型text(), integer(), boolean(), timestamp()从 drizzle-orm/pg-core 导入
类型推断typeof table.$inferSelect, $inferInsert直接从 Schema 推导 TS 类型
关系查询db.query.table.findMany({ with, where })要求将 Schema 传入 drizzle() 客户端
类 SQL 查询db.select().from(table).where()可链式调用,返回行数组
插入db.insert(table).values({}).returning()使用 .returning() 获取插入的行
更新db.update(table).set({}).where().returning()始终包含 .where(),以避免更新整张表
删除db.delete(table).where()始终包含 .where(),以避免删除整张表
Upsert.onConflictDoUpdate({ target, set })在 .insert().values() 后链式调用
事务db.transaction(async (tx) => { ... })抛出错误时自动回滚
筛选器eq(), and(), or(), inArray(), sql\``从 drizzle-orm 导入运算符
关系relations(table, ({ one, many }) => ({}))为关系查询声明逻辑关系
生成迁移drizzle-kit generate根据 Schema 差异创建 SQL 迁移文件
应用迁移drizzle-kit migrate 或代码中的 migrate()将待处理的迁移应用到数据库
推送 Schemadrizzle-kit push直接推送 Schema,不生成迁移文件
预处理语句db.select().from(t).where(eq(t.id, sql.placeholder('id'))).prepare()可复用的参数化查询
视图pgView('name').as(qb => ...)普通视图和物化视图
$count 工具db.$count(table, filter?)计数简写,可用作子查询
生成列text().generatedAlwaysAs(() => sql\...`)`计算列(虚拟或存储)
检查约束check('name', sql\condition`)`在数据库层面进行行级验证

常见错误

错误正确做法
插入/更新时缺少 .returning()链接调用 .returning() 以获取插入/更新后的行
更新/删除时省略 .where()始终提供 .where(),以避免影响所有行
查询结果类型使用 any使用 $inferSelect / $inferInsert 获取类型安全的结果
未向 drizzle() 客户端传入 schema传入 { schema } 以启用 db.query 关系 API
忘记在外键列上创建索引为用于联接/查找的列添加显式索引
未在事务中包装相关写入对多表变更使用 db.transaction()
使用 casing: 'snake_case' 时使用原始列名使用大小写转换选项时,以 camelCase 定义列,不带名称参数
声明关系但遗漏反向关系关系两端都需要声明,才能进行关系查询
在新的 PostgreSQL 架构中使用 serial()优先使用 integer().generatedAlwaysAsIdentity()(现代做法)
未处理 findFirst 返回 undefined访问属性前检查是否为 undefined
从错误的方言模块导入列类型PostgreSQL 使用 drizzle-orm/pg-core,MySQL 使用 mysql-core,SQLite 使用 sqlite-core
使用 .references() 代替 relations().references() 用于 SQL 外键;relations() 用于查询 API

委派

如果有 tanstack-query skill,请将客户端缓存和服务端状态管理委派给它。 否则,建议使用:npx skills add oakoss/agent-skills --skill tanstack-query

如果有 tanstack-start skill,请将数据库访问的服务端函数模式委派给它。 否则,建议使用:npx skills add oakoss/agent-skills --skill tanstack-start

如果有 electricsql skill,请将 Electric 设置、shape 配置和写入模式委派给它。 否则,建议使用:pnpm dlx skills add oakoss/agent-skills -s electricsql -a claude-code -y

如果有 pglite skill,请将 PGlite 专属配置、扩展和浏览器存储模式委派给它。 否则,建议使用:pnpm dlx skills add oakoss/agent-skills -s pglite -a claude-code -y

  • 架构验证:使用 drizzle-zod 从 Drizzle 表生成 Zod 架构以验证输入
  • 查询模式探索:使用 Explore Agent
  • 代码审查:委派给 code-reviewer Agent

参考资料

评论

支持 Markdown