SuperAPI AI 工具集

database-migrations

编程与开发

查看项目

更新于 10-16 04:08

技能介绍

用途

该技能用于在 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 特性(如并发索引),其他数据库的兼容性暂未提供。