Web Marina

日々の業務や勉強などで得た知識をアウトプットしていきます。

【Rails】$rake db:rollbackしたい時の間違えない手順

f:id:song-of-life1352607:20170220105406j:plain

こんにちは、マリンです。

未だ初心者の域を脱しない私は、よく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) ========================

これで無事修正完了です。


こちら参考にさせていただきました。

www.d-wood.com

追記

1ヶ所$rails db:versionと書いてしまいましたが、

Rails5の場合これでもいけます。

Rails4以前の場合は$rakeでお願いします。