用途:在 AdonisJS 应用中处理 Lucid 数据库层。Lucid 以数据库为先:迁移修改数据库,Lucid 生成 database/schema.ts,模型继承生成的 schema 类并声明关系、钩子、作用域、序列化与领域行为。若任务同时涉及控制器、路由、验证器、策略、服务或更广的 AdonisJS 架构,需配合 adonisjs 技能;编写 Lucid 行为测试时配合 japa 技能。
核心规则:以数据库为唯一事实来源;在迁移中写 schema 变更,再运行迁移或 schema:generate 刷新 database/schema.ts;不要手动编辑生成的 database/schema.ts;模型文件通常继承生成的 schema 类,只放关系、钩子、作用域、序列化覆盖与领域方法;SQL 密集查询、报表、一次性脚本或无需模型水合时用 db 服务;需要 Active Record 行为、关系、钩子、作用域、序列化或模型实例时用模型查询;优先使用 db.transaction(async (trx) => ...) 托管事务,除非事务生命周期必须跨函数边界;破坏性 update/delete 必须带 where 约束;用预加载代替循环内查询;用 withCount、withAggregate、has、whereHas 做关系过滤与聚合。
工作流:改动持久化数据时,先识别现有表、生成的 schema 类、模型与关系;先写或更新迁移;运行迁移或记录重新生成 database/schema.ts 的命令;更新模型继承生成的 schema 类并添加 Lucid 专属行为;约定不匹配时显式指定关系键;按访问模式选用查询构建器、作用域或工厂;用聚焦测试或仓库可用的类型检查命令验证。接入已有数据库时:配置连接;在 schemaGeneration.excludeTables 中排除非托管表;运行 node ace schema:generate;只为应用拥有的表创建模型;用 schema 规则或模型级覆盖处理约定不匹配。
API 选择:建表或改 schema 用 BaseSchema 迁移;类型化模型列用 database/schema.ts 生成的 schema 类;行上的领域行为用模型方法与钩子;关系加载/过滤用模型查询构建器;报表或 SQL 密集读取用 db.from、db.query、原始查询构建器;多写一致性用托管事务;测试数据用模型工厂;初始/开发数据用数据库种子。
参考:实现前加载相关本地参考——references/schema-and-models.md(迁移、schema 生成、schema 类、CRUD、作用域、钩子、序列化)、references/query-builders.md(db 服务查询、模型查询构建器行为、分页、原始 SQL、调试)、references/transactions.md(托管/手动事务、隔离级别、保存点、行锁、模型事务、事务内关系写入)、references/relationships.md(belongsTo、hasOne、hasMany、manyToMany、hasManyThrough、预加载、关系过滤、聚合、写入)、references/testing.md(测试数据库状态、工厂、工厂关系、中间表属性、钩子、种子)。每个参考先给核心工作模式,末尾链接官方 Lucid 文档。
反模式:避免手动编辑 database/schema.ts,改用迁移、schema 规则或模型覆盖;避免在模型文件中手动声明每一列,改为继承生成的 *Schema 类;避免循环内跑关系查询,改用 preload、嵌套预加载、withCount、withAggregate;避免无作用域的 update 或 delete,始终带显式 where 约束;避免为简单操作手动开事务,改用托管 db.transaction 回调;避免为集成路径 mock Lucid 查询行为,改用 Japa 配合测试数据库/工厂;避免所有报表查询都用模型,纯行数据足够时用 db 服务。