SuperAPI AI 工具集

database-schema

编程与开发

查看项目

更新于 10-15 09:39

技能介绍

用途

Database Schema 是一个“模式感知”技能,用于 AI 编码助手(如 Claude)的数据库相关工作。它要解决的问题是:会话进行到中途时,AI 会忘记数据库模式的细节,导致列名写错、遗漏字段、类型不正确。TDD 只能在运行时发现这类问题,而本技能希望更早地预防。

核心能力

核心规则是:在编写任何触碰数据库的代码之前,先读取模式。必做步骤包括:

  1. 读取模式文件(位置见下文);
  2. 核验即将使用的列与类型确实存在;
  3. 在编写查询时于回复中引用模式;
  4. 使用生成的类型(Drizzle/Prisma 等)进行类型检查。

若模式文件不存在,则要求先创建后再继续。

按技术栈的模式位置与类型生成

技能给出了一张对照表:

  • Drizzle:模式位于 src/db/schema.ts 或 drizzle/schema.ts,使用内置 TypeScript 类型。
  • Prisma:模式位于 prisma/schema.prisma,使用 npx prisma generate 生成类型。
  • Supabase:模式位于 supabase/migrations/*.sql 加类型,使用 supabase gen types typescript 生成。
  • SQLAlchemy:模式位于 app/models/*.py 或 src/models.py,使用 Pydantic 模型。
  • TypeORM:模式位于 src/entities/*.ts,装饰器即类型。
  • 原生 SQL:模式位于 schema.sql 或 migrations/,需要手动维护类型。

模式速查文件

技能建议创建 _project_specs/schema-reference.md,用于快速查阅,其中可列出各表(如 users、orders)的列、类型、是否可空、默认值与备注,以及关系与枚举。文件为自动生成或人工维护,并提示 AI 在数据库工作前先读它。

使用方式

在写任何数据库代码前,AI 必须完成“模式核验清单”:读取模式文件路径、列出所用列并确认存在、列出类型映射、核对外键关系、处理可空字段。技能给出了一个实际示例,针对“添加订单历史端点”任务逐项勾选核验内容。

技能还给出各栈的类型生成命令与代码片段,例如 Drizzle 通过 pgTable 定义表并导出 $inferSelect / $inferInsert 推导类型;Prisma 在 schema.prisma 中定义模型并用 npx prisma generate 生成;Supabase 用 supabase gen types typescript 从本地或远程数据库生成 TypeScript 类型;SQLAlchemy 结合 Pydantic 定义校验模型。此外还给出类型安全查询示例,说明 Drizzle 与 Prisma 能在编译期捕获错误列名,而原生 SQL 字符串没有类型保护,容易在运行时才暴露错误。

工作流

技能把模式校验作为扩展版 TDD 流程的第 0 步:先读并核验模式、记录缺失的表或列;然后 RED——编写使用正确列名并导入生成类型的测试,使测试失败只源于逻辑而非模式错误;接着 GREEN——用类型安全查询实现;最后 VALIDATE——用 tsc --noEmit 或 mypy 捕获模式漂移,用测试验证运行时行为。

迁移工作流为:更新模式文件、生成迁移(Drizzle 用 npx drizzle-kit generate,Prisma 用 npx prisma migrate dev --name add_column,Supabase 用 supabase migration new add_column)、重新生成类型、更新 schema-reference.md、运行类型检查找出所有破损代码、修复类型错误并更新测试后执行完整验证。

会话启动协议要求:会话涉及数据库工作时,立即读取模式文件,读取 _project_specs/schema-reference.md(若存在),在会话状态中记录相关的表与列,并在写代码时显式引用模式。技能还列出常见模式错误及预防方式,以及一长串反模式(如猜测列名、使用原生 SQL 字符串、不核验硬编码、忽略类型错误、迁移后不重新生成类型、假定可空性)和设置与逐任务清单。

适用场景

适合 AI 辅助的数据库开发场景,包括编写查询、生成接口、执行迁移和做类型安全检查。使用效果与项目是否配置了模式文件与类型生成相关;对于没有模式文件或类型生成配置的项目,技能会要求先补齐这些前提,具体命令与代码需按所用技术栈执行。