SuperAPI AI 工具集

rails-migration-safety

编程与开发

查看项目

更新于 10-15 22:17

技能介绍

用途:在真实生产环境中安全地执行 Rails 数据库 schema 变更,尤其针对大表或高负载表。核心原则是优先分阶段上线,而不是一次性迁移。

主要能力:提供各类操作的安全模式参考。加列:先可空,后回填,最后加 NOT NULL;大表加索引:PostgreSQL 用 algorithm: :concurrent,MySQL 用 :inplace;数据回填:用批处理任务,不放在迁移事务内;重命名列:新增、复制数据、迁移调用方、删除旧列;加 NOT NULL:在回填确认所有行都有值之后;加外键:先清理孤儿记录;删列:先移除代码引用再删列。

硬性约束:不得把 schema 变更与数据回填放在同一个迁移中;不得对未完全回填的列加 NOT NULL;不得在所有代码引用移除前删列。

审查顺序:识别数据库与表规模风险;分离 schema 变更与数据回填;检查索引、约束、默认值和表重写的锁行为;规划应用代码与迁移代码的部署顺序;规划回滚或前向修复策略。

使用方式:若项目使用 strong_migrations 则遵循它,否则手动应用同样的安全规则。示例中给出安全写法:先 add_column :orders, :status, :string,再在独立部署中批处理回填,最后 change_column_null 与 change_column_default。大表索引示例:disable_ddl_transaction! 后 add_index :orders, :processed_at, algorithm: :concurrent;MySQL 用 algorithm: :inplace。

适用场景:生产数据库迁移的规划与代码审查,包括加列、索引、约束、回填、重命名、表重写、并发操作等。

限制与常见错误:小表也应按分阶段习惯处理,因为表会增长;schema 变更与回填合并会导致长事务与长锁;列重命名立即切换应用会在部署期间崩溃;add_index 不加 algorithm: :concurrent 会在 PostgreSQL 大表上阻塞写入;回填未完成就加 NOT NULL 会失败或锁表;删列前未移除代码引用会导致应用崩溃。复杂类型变更、多步唯一约束、外键验证延迟、安全删列与多数据库迁移需参考 PATTERNS.md。可与其他技能链式使用:审查含迁移的 PR 时用 rails-code-review,schema 变更后的回填任务用 rails-background-jobs,迁移涉及敏感数据时用 rails-security-review。