78
66

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

rails db:rollbackって一つずつしか差し戻せないんだよって話

Posted at

先日、学習中のスクールで同期からテーブルのカラムを間違えてしまったので修正したい、どうすればよいかと聞かれ、即座に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。
めでたしめでたし。

総括

一人で作業を行っている分には全く問題はないが、チーム開発でカラムの変更を突然行うと齟齬が発生し、迷惑がかかってしまう可能性しかないので気を付けなければならないって。
言われてみればそりゃそうだ( ´_ゝ`)

78
66
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
78
66

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?