【Rails】$rake db:rollbackしたい時の間違えない手順
こんにちは、マリンです。
未だ初心者の域を脱しない私は、よくmigration
周りでやらかします。
一人でやっていた頃は失敗すると
「ロールバックしちゃえ〜」「migrationファイル消しちゃえ〜」
とかやっていましたが、
チームでやっているとそんな横暴は許されません・・・
今回丁度勉強で作っていたサンプルで失敗したので、
ロールバックの正しいやり方?を学びました。
migration周りの注意
そもそもなぜこのあたり注意しなきゃいけないのか?
今更気づいたので一応書いておきます。
migrationファイルを書き換えたり削除した場合、
当然次回$rake db:migrate
した時にテーブル構造が変わってきます。
一人でやっている分には大して支障はないですが、
これをチームでやっているリモートリポジトリなんかにあげちゃったりすると・・・
それをマージした他の方の環境まで変わってしまい、
最悪「コードの辻褄が合わない!」なんてことになりかねません。
ということで、この辺のファイルがどれほど恐ろしいものか気づいた私は、
今後は普段から取り扱いに注意する癖をつけようと肝に銘じました。
rollbackの手順
さて本題です。前述の通りこの辺は取り扱い注意なので、
失敗しない手順を学びました。
現在の状況を確認する
まずはどこまでmigrate
が実行されているかを確認しましょう。
$rake db:version
このコマンドで確認できます。
$ rails db:version Current version: 20171112122350
こんな感じで出てきます。
20171112122350まで実行されていますね。
ロールバック
次に戻したいところまでロールバックします。
[一つ前まで戻す]
$rake db:rollback
[任意のファイルまで戻す]
$rake db:rollback STEP=○
現在地を含めた○個前までなかったことにしてくれます。
(つまり○+1個前のファイルまで実行された状態)
migrateされていないファイルを確認
念のためどのファイルが実行されていないか確認します。
$rake db:abort_if_pending_migrations You have 1 pending migrations: 20171112131249 CreateUsers
20171112131249のUserテーブルが作られていないようです。
ファイルを修正
class CreateUsers < ActiveRecord::Migration[5.1] def change create_table :users do |t| t.references :comment, index: true, foreign_key: true # null: falseを削除 t.string :name t.string :email t.timestamps end end end
今回はCommentテーブルにレコードが何も入っていない状態で
NOT NULLにしてしまったため失敗したので、
null: false
を削除します。
migrate
修正が完了したらマイグレートを実行します。
$rake db:migrate == 20171112131249 CreateUsers: migrating =============================== -- create_table(:users) -> 0.0026s == 20171112131249 CreateUsers: migrated (0.0027s) ========================
これで無事修正完了です。
こちら参考にさせていただきました。
追記
1ヶ所$rails db:version
と書いてしまいましたが、
Rails5の場合これでもいけます。
Rails4以前の場合は$rake
でお願いします。