この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:4
ページ更新者:T
更新日時:2026-06-11 07:07:02

タイトル: マイグレーションの実行(migrate)
SEOタイトル: Rails の rails db:migrate の使い方:実行・ロールバック・状態確認・本番運用のポイント

この記事の要点
  • rails db:migrate(または rake db:migrate)でマイグレーションファイルの内容を DB に適用する
  • 実行されたマイグレーションは schema_migrations テーブルに記録され、二重適用されない
  • 一段戻したいときは rails db:rollback、状態確認は rails db:migrate:status
  • 本番では RAILS_ENV=production を必ず指定。バックアップ後に実行するのが鉄則

マイグレーション実行コマンドとは

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=33 つ分戻す
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:loadschema.rb から一気にテーブル作成(開発初期化向け)
rails db:resetdrop → 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 articles

down になっているものが未適用です。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:migratedb:rollback の両方を確認しておく

schema:load との使い分け

シーン推奨
本番運用・既存 DB への差分反映db:migrate
開発環境を一から作り直すdb:schema:load(高速)
テスト DB の初期化db:schema:load

関連記事