用途:在已有 Elixir 项目中处理 Ecto 相关持久化工作,包括 schema、查询、changeset、关联、preload、事务和持久化边界。
主要能力与约定:
- Schema 与 changeset:用 schema 建模持久化数据,用 changeset 校验外部输入;外部 map 使用 cast/3 并显式列出字段白名单,可信内部更新用 change/2;通过 unique_constraint/3、foreign_key_constraint/3 或对应约束助手把数据库约束附加到 changeset,让预期数据库错误返回 changeset 错误。
- 关联:明确关联归属与删除行为;仅当嵌套输入属于公开操作时才用 cast_assoc/3。
- 查询与关联:用命名绑定和参数化值组合 Ecto.Query,绝不把用户输入插入 SQL;可复用过滤与排序放在查询函数中,策略与编排放在 context。
- Preload:只预加载调用方需要的数据;对列表检查查询次数,优先用 join 或批量 preload,避免逐行 Repo.get/2。
- 写入与事务:预期失败返回 {:ok, value} / {:error, changeset_or_reason};多命名步骤或失败步骤对调用方重要时用 Ecto.Multi,小型原子块用普通事务;事务内不放网络调用或其他不可逆副作用;upsert 需说明冲突目标并验证数据库约束匹配。
- 边界:业务规则放在 context 或纯领域模块,Repo 调用保持在持久化边缘。
- 验证:为变更的持久化行为新增或更新测试,先跑聚焦测试,再跑覆盖 Ecto 与迁移的项目检查;仅当更窄行为是核心时使用 ecto-changeset-patterns、ecto-nested-associations 或 ecto-migration。
限制:资料未提供安装方式、支持版本、平台或收费信息,暂未提供。