タイトル: マイグレーションの実行(migrate)
SEOタイトル: Rails の rails db:migrate の使い方:実行・ロールバック・状態確認・本番運用のポイント
| この記事の要点 |
|
マイグレーション実行コマンドとは
Ruby on Rails では、テーブルの作成・カラム追加・索引の変更などスキーマ変更を Ruby のコード(マイグレーションファイル)として管理します。これらのファイルを実際に DB に反映するコマンドが rails db:migrate です。Rails 4 以前は rake db:migrate でしたが、現在は rails コマンド経由が推奨です(どちらも内部的には同じ処理を呼び出します)。
基本構文
rails db:migrate [VERSION=タイムスタンプ] [RAILS_ENV=環境名]
シンプルな使用例
$ rails db:migrate
== 20180427173502 CreateTests: migrating ======================================
-- create_table(:tests)
-> 0.0123s
== 20180427173502 CreateTests: migrated (0.0150s) =============================未適用のマイグレーションファイルが上から順に実行され、schema_migrations テーブルに該当ファイルのタイムスタンプが記録されます。記録済みのものは再実行されません。
よく使うサブコマンド
| コマンド | 役割 |
|---|---|
rails db:migrate | 未適用のマイグレーションを順に実行 |
rails db:rollback | 直前のマイグレーションを 1 つ戻す |
rails db:rollback STEP=3 | 3 つ分戻す |
rails db:migrate:redo | 直前のマイグレーションを 1 回戻して再実行 |
rails db:migrate:up VERSION=... | 指定したマイグレーションだけ up |
rails db:migrate:down VERSION=... | 指定したマイグレーションだけ down |
rails db:migrate:status | 各マイグレーションの up/down 状態を一覧 |
rails db:schema:load | schema.rb から一気にテーブル作成(開発初期化向け) |
rails db:reset | drop → create → schema:load → seed |
状態確認の例
$ rails db:migrate:status
database: app_development
Status Migration ID Migration Name
--------------------------------------------------
up 20180427173502 Create tests
up 20180510120010 Add email to users
down 20180523080055 Add index to articlesdown になっているものが未適用です。rails db:migrate で残りが一気に適用されます。
ロールバック例
# 直前を 1 つ戻す
$ rails db:rollback
# 3 つ戻す
$ rails db:rollback STEP=3
# 特定バージョンを戻す
$ rails db:migrate:down VERSION=20180523080055
環境ごとの実行
環境を切り替えるには RAILS_ENV を指定します。本番ではこの指定を忘れると開発 DB を触ってしまう事故が起きるので注意。
# 開発(デフォルト)
$ rails db:migrate
# テスト
$ RAILS_ENV=test rails db:migrate
# 本番
$ RAILS_ENV=production rails db:migrate
本番運用での注意点
- 必ずバックアップをしてから流す。テーブル削除や列削除を含むマイグレーションは取り返しがつかない
- 大規模テーブルへの索引追加・カラム追加は長時間ロックする可能性がある。
algorithm: :concurrently(PostgreSQL)や、メンテナンスウィンドウを確保 - マイグレーションはデプロイの前か後かを明確に決めておく(互換性のないスキーマ変更は段階的に)
- 失敗時に部分適用にならないよう、複雑な処理は
reversibleブロックやsafety_assuredを活用 - CI で
db:migrateとdb:rollbackの両方を確認しておく
schema:load との使い分け
| シーン | 推奨 |
|---|---|
| 本番運用・既存 DB への差分反映 | db:migrate |
| 開発環境を一から作り直す | db:schema:load(高速) |
| テスト DB の初期化 | db:schema:load |