先日、学習中のスクールで同期からテーブルのカラムを間違えてしまったので修正したい、どうすればよいかと聞かれ、即座にrollbackを使うんだよ!と答えられなかったことが悔しかったので備忘録として。
そもそもrollbackとは?
rails db:migrateを行うことでマイグレーションファイルに記載の内容でデータベースのテーブルにカラムを反映させることができる。
が、カラム名を修正する際にはただマイグレーションファイルを編集してrails db:migrateを再実行するだけでは修正はされない。
その為、一度テーブルを差し戻し、マイグレーションファイルを修正してから再度rails db:migrateを実行する必要がある。
その差し戻しの際に使われるのがrails db:rollbackである。
初めて知ったrollbackの仕様
rails db:migrate:statusでマイグレーションファイルの状態を確認。
$ rails db:migrate:status
Status Migration ID Migration Name
--------------------------------------------------
up 20191105052241 Devise create users
up 20191106063303 Create groups
up 20191106063350 Create group users
up 20191107034603 Create messages
rails db:rollbackを実行し、再度rails db:migrate:statusを実行。
$ rails db:migrate:status
Status Migration ID Migration Name
--------------------------------------------------
up 20191105052241 Devise create users
up 20191106063303 Create groups
up 20191106063350 Create group users
down 20191107034603 Create messages
直近のマイグレーションファイル1つしか差し戻せないんですよね。
今まで使う機会が全くなかったので見もしなかったんですが、rollback実行した時に1つしか差し戻されてないことはターミナルのログに記載がありました。
$ rails db:rollback
== 20191107034603 CreateMessages: reverting
===================================
-- drop_table(:messages)
-> 0.0278s
== 20191107034603 CreateMessages: reverted (0.0318s)
==========================
何個分差し戻したいかとかで指定できたらいいのにって思うんですが、ありました。
STEP=nを付け加えればいいだけです。
$rails db:rollback STEP=2
==省略==
$ rails db:migrate:status
Status Migration ID Migration Name
--------------------------------------------------
up 20191105052241 Devise create users
down 20191106063303 Create groups
down 20191106063350 Create group users
down 20191107034603 Create messages
現在の状態から+2つ分差し戻されました。
で、マイグレーションファイルの修正が終わったらいつも通りrails db:migrateを実行すれば全てstatusがupになりますと。こっちは全部のマイグレーションファイルが反映されるので1回でOK。
めでたしめでたし。
総括
一人で作業を行っている分には全く問題はないが、チーム開発でカラムの変更を突然行うと齟齬が発生し、迷惑がかかってしまう可能性しかないので気を付けなければならないって。
言われてみればそりゃそうだ( ´_ゝ`)