Railsマイグレーション取り消しメモ(Docker環境Ver)
いつも覚えているけどなんとなく覚えていなくて
「あれ?このコマンドなんだっけ?」となるので、
自分用ナレッジとして残しておきます。
Docker環境(backend コンテナ)を前提にしています。
適宜 backend は環境に合わせて読み替えてください。
マイグレーションファイルの状態確認
docker compose exec backend rails db:migrate:status
出力例:
database: db/development.sqlite3
Status Migration ID Migration Name
up 20251006021745 create_system_masta
up 20251003035213 create_customer_ranks
up 20251001102518 create_customers
Migration ID を控えておきます(例:20251006021745)。
対象マイグレーションを取り消す
docker compose exec backend rails db:migrate:down VERSION=20251006021745
VERSION= の後ろは上で確認したマイグレーションIDを指定。
成功例:
== 20251006021745 CreateSystemMasta: reverting ===========================
-- drop_table(:system_masta)
-> 0.0034s
== 20251006021745 CreateSystemMasta: reverted (0.0042s) ==================
不要なマイグレーションファイルを削除
rm backend/db/migrate/20251006021745_create_system_masta.rb
schema.rb の整合性確認(念のため)
cat backend/db/schema.rb | grep system_masta
何も出力されなければOKです。
ログ履歴をクリーンにしたい場合(開発環境専用)
docker compose exec backend rails db:migrate:reset
注意:DBが再構築されるため、既存データは全て削除されます。
本番環境では絶対に実行しないこと。
強制的に直前のマイグレーションを取り消す
もし VERSION の指定が分からない場合は、
直近の1件を巻き戻すことも可能です。
docker compose exec backend rails db:rollback STEP=1
| 操作内容 | コマンド |
|---|---|
| 状態確認 | docker compose exec backend rails db:migrate:status |
| 指定マイグレーション取り消し | docker compose exec backend rails db:migrate:down VERSION=xxxx |
| ファイル削除 | rm backend/db/migrate/..._create_xxx.rb |
| スキーマ確認 | `cat backend/db/schema.rb |
| 強制巻き戻し(1件) | docker compose exec backend rails db:rollback STEP=1 |
| DBリセット(開発専用) | docker compose exec backend rails db:migrate:reset |
追加でよく使う関連コマンド
新しいマイグレーションを作成
docker compose exec backend rails g migration add_column_to_users
モデルとマイグレーションを同時に生成
docker compose exec backend rails g model Product name:string price:integer
すべてのマイグレーションを最新に適用
docker compose exec backend rails db:migrate
スキーマを再読み込み
docker compose exec backend rails db:schema:load
備考
migrate:down は(逆操作が定義済み)でのみ動作します。
定義されていない場合は rails db:rollback STEP=1 を使うのが安全です。
Docker環境ではコンテナ名を必ず付与(例:backend)するのを忘れずに。
実用ポイント
Qiitaや個人ノートに貼るときは「backend」の部分を変数化しておくと再利用しやすいです。
例:
APP=backend
docker compose exec $APP rails db:migrate:status