用途
该技能用于在 Rails 8 应用中创建安全的数据库迁移,确保生产环境稳定性。核心目标包括:零停机部署、可回滚迁移、正确的索引、数据完整性约束以及性能考量。
主要能力
安全迁移模式
- 添加列(安全):使用
add_column并设置默认值与null: false。 - 添加 NOT NULL(两步法):对已有数据的表,先添加带默认值的列(允许暂时为 NULL),回填后再通过
change_column_null添加 NOT NULL 约束。 - 添加索引(生产安全):使用
disable_ddl_transaction!与algorithm: :concurrently,并配合if_not_exists: true。 - 添加外键与索引:使用
add_reference并设置foreign_key: true, index: true。 - 重命名列(安全):使用
rename_column。 - 删除列(安全):先在代码中移除引用,再迁移,并使用
safety_assured包裹remove_column。 - 添加枚举列:使用整数列并添加索引,在模型中定义
enum。
危险操作规避
避免直接使用 change_column 更改列类型,因为可能丢失数据或锁表。推荐做法是:添加新列、迁移数据、删除旧列。
数据迁移
- 安全回填模式:使用
in_batches分批更新,并加入sleep降低数据库负载。 - 大表使用后台任务:迁移仅添加列,回填通过后台 Job 与 Rake 任务分批入队执行。
索引策略
- 复合索引:注意列顺序对查询的影响。
- 部分索引:仅索引活跃记录或非空值。
- 唯一索引:支持全局唯一与作用域内唯一。
外键
支持添加外键、自动索引、指定列名,以及 on_delete: :cascade、:nullify、:restrict 等选项。
Strong Migrations Gem
提供安装、配置(start_after、target_version、自定义检查)以及通过 safety_assured 处理警告的方式。
可逆迁移
- 使用
change自动反转。 - 使用
up/down手动反转。 - 不可逆迁移需抛出
ActiveRecord::IrreversibleMigration。
迁移测试
包括迁移与回滚测试、db:migrate:status 检查,以及通过 RSpec 验证外键索引的 Schema 检查。
性能提示
避免表锁:大表索引使用 algorithm: :concurrently。批量操作:使用 in_batches 分批更新。
使用方式
快速开始命令:
# 生成迁移
bin/rails generate migration AddStatusToEvents status:integer
# 运行迁移
bin/rails db:migrate
# 回滚
bin/rails db:rollback
# 检查状态
bin/rails db:migrate:status
适用场景
适用于 Rails 8 应用的数据库结构变更,尤其是生产环境中的表创建、列添加、索引创建、外键管理、数据回填等操作。
限制
资料未提供该技能的具体安装方式、收费模式、平台支持范围或效果保证。部分内容依赖 strong_migrations gem 与 PostgreSQL 特性(如并发索引),其他数据库的兼容性暂未提供。