关于 tech-drizzle
tech-drizzle 是面向 Drizzle ORM 开发者的技能,用于定义模式并构建类型化数据库查询。它涵盖关系查询、预编译语句、迁移和事务,并提供提升效率与一致性的实践模式。
主要功能
- 01模式设计与 TypeScript 类型推断
- 02嵌套关系查询
- 03带占位符的预编译语句
- 04版本化迁移与 SQL 审查
- 05事务与保存点
适用场景
- 01为应用定义表和关系
- 02通过嵌套查询获取关联记录
- 03在频繁执行的路径复用查询
- 04应用模式变更并保持数据一致
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ ravnhq/ ai-toolkit --skill tech-drizzle安装后在 Claude Code 中输入/tech-drizzle确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
rules/_sections.mdmigration-push-vs-generate.mdmigration-review-sql.mdmigration-transaction-safety.mdqb-prepared-statements.mdqb-use-for-aggregations.mdrqb-prefer-relational.mdrqb-select-columns.mdrqb-with-eager-loading.mdschema-export-order.mdschema-infer-types.mdschema-one-table-per-file.md详细介绍
Drizzle ORM 类型安全的数据库访问
轻量、无头的 TypeScript ORM,零依赖。Drizzle 擅长:
- 类型推断 — 从架构中获取完整的 TypeScript 类型;无需生成类型或使用单独的架构语言
- 关系查询 — 使用
.with()获取嵌套数据,无需手动联接 - 预处理语句 — 预编译查询以便重复执行;显著提升性能
- 迁移 — 使用 drizzle-kit 对架构变更进行版本控制;支持回滚
- 事务 — 原子性提交多项操作,并通过保存点支持嵌套事务
核心模式:每个文件一个表、使用关系 API 进行嵌套查询、对热点路径使用预处理语句、使用事务确保一致性。
工作流
使用 Drizzle ORM 时:
- 设计架构 — 表、列、约束;每个文件一个表
- 定义关系 — 使用
defineRelations()定义一对多、多对多关系;支持嵌套查询 - 选择查询风格 — 嵌套数据优先使用关系 API,也可使用 SQL 构建器以获得灵活性
- 优化热点路径 — 对重复查询使用带占位符的预处理语句
- 处理事务 — 使用
db.transaction()包裹多项写入操作 - 测试迁移 — 推送前运行
drizzle-kit migrate:dev;检查生成的 SQL - 提取类型 — 使用
InferSelectModel从架构中获取运行时类型
规则
模式按关注点分类:
- 架构 — 表设计、列类型、约束、每个文件一个表
- 关系查询 — 使用
with()获取嵌套数据、部分列和筛选数据 - 查询构建器 — 使用 SQL 构建器进行聚合和复杂查询
- 预处理语句 — 预编译以提升性能;使用占位符传递参数
- 迁移 — 版本控制、检查 SQL、推送与生成
- 事务 — 原子操作、保存点、错误处理
请参阅 rules/,了解实现模式和示例。
示例
正向触发
用户:“为订单定义一个 Drizzle 架构,并建立与用户和产品的关系。”
预期行为:使用 tech-drizzle 指南,应用架构设计、关系查询和类型推断。
非触发
用户:“编写一条原始 SQL 迁移,为 users 表添加一列。”
预期行为:不要优先使用 tech-drizzle;选择更相关的技能,或不使用技能直接处理。
-
错误:在紧密循环中运行未经预处理的查询
-
原因:每次执行都会编译查询;没有复用已解析的 SQL
-
解决方案:使用带占位符的
.prepare();使用不同参数多次执行 -
错误:在代码中手动联接;先获取父项,再单独获取子项
-
原因:未使用关系 API;编写了复杂的联接逻辑
-
解决方案:定义关系,使用
.with()在单个查询中获取嵌套数据
故障排除
-
错误:从关系中选择数据时出现
Column not included in result -
原因:选择嵌套关系时未显式包含列
-
解决方案:使用
columns: { id: true, name: true }指定嵌套关系的列 -
错误:事务意外回滚;没有明确错误信息
-
原因:
db.transaction()内存在未处理的 Promise 拒绝 -
解决方案:使用 try/catch 包裹事务操作;必须捕获所有错误
-
错误:迁移后架构类型未更新
-
原因:drizzle-kit 未重新生成类型;缓存已过期
-
解决方案:架构变更后运行
drizzle-kit generate