用途:为 Rails 项目编写和审查数据库迁移,重点是安全性与可发布性,覆盖 schema 变更、数据回填与约束加固。
主要能力与规则:迁移尽量可逆,必要时用 reversible 块配合显式 up/down SQL;数据操作使用原生 SQL,避免引用会随时间漂移的应用模型;避免在大表上长时间锁表,将高风险工作拆成多个可安全部署的步骤;schema 变更与重型数据回填分离;优先使用可重复运行仍安全的数据库操作,用 table_exists? / column_exists? 做守卫。短小的内联回填可放在单个迁移中(加列 → 执行 UPDATE → 收紧约束),耗时长的回填应移出迁移路径。
回填脚本:长期或高风险的数据回填放在 script/migrations/*.rb,手动运行(如通过 Kamal),不占用部署迁移窗口。要求头部注释写明前置条件与运行说明,预检查询先打印范围,幂等(已处理的行跳过),分批执行(find_each / in_batches),避免一次性大写入。
安全模式:先加可空列 → 回填 → 强制 NOT NULL;按需并发加索引;加唯一索引前先在同一迁移中用原生 SQL 去重;纯数据迁移合法(上行 find_each + update!,下行 update_all);分批回填。
约束策略:优先数据库级唯一索引而非 AR 的 validates uniqueness(校验存在竞态,索引没有)。外键是取舍,可全部移除(references 用 foreign_key: false)换取 DDL 速度与分片友好,但需一致且有文档。可用廉价 schema 技巧实现特殊不变量,如用默认 0 的 singleton_guard 列加唯一索引做单例表。
多租户索引:改用 [account_id, ...] 复合索引,删除冗余单列索引并注释原因;作用域唯一性放在数据库层,如 add_index :tags, [:account_id, :title], unique: true。
多库/多适配器:Solid Queue/Cache/Cable 各有独立数据库与 migrations_paths、schema 文件;同时支持 SQLite 与 MySQL 时,在迁移里用适配器守卫提前返回,使用适配器特定 DDL,并做双份 schema 转储。生产 SQLite 可设 default_transaction_mode: immediate,生产环境禁用 dump_schema_after_migration。
分阶段发布:列替换分四步(加可空列、双写/回填、读新列、加约束后删旧列);约束加固先清理数据再加索引/约束,最后切换应用行为;破坏性变更先在应用层弃用读写,单独部署移除使用,确认窗口后再删列/表。
危险信号:无理由的不可逆迁移、一步合并 schema 重写与重型数据迁移、在事务繁重的默认迁移里做大回填、未分阶段弃用就删列删表、迁移中引用应用模型、未去重就加唯一索引、只有 validates uniqueness 而无底层唯一索引。
限制:资料未提供具体安装命令、收费信息与完整代码示例。