bundle exec rails db:migrate
をした際に思ってた通りにマイグレーションできずに、失敗することがあります。
この時、git操作でchanged を消すと、migrationした履歴だけが残ってしまい、
マイグレーションステータスにNO FILEが存在していてやっかいなことになります。
汚れてしまったマイグレーション履歴をきれいに戻す手順を示していきます。
とりあえずstatusコマンドで状況を確認
$ bundle exec rake db:migrate:status
database: ***/development.sqlite3
Status Migration ID Migration Name
--------------------------------------------------
up 20200707153004 Create users
up 20200711014336 Create groups
up 20200715054409 Create graphs
up 20200715072011 Add group id to graph
up 20200729104800 Add default temp3 to graph
up 20200729105435 Add default temp2 to graph
up 20200729124216 Add values to graphs
up 20200729124408 ********** NO FILE **********
この ********** NO FILE **********
状態が存在すると、以降、bundle exec rails db:migrate
が成功しなくなります。
## とりあえずNO FILE状態から脱出
上記のstatusコマンドで確認したMigration IDをもとにし、以下のファイルを作成。
$ vi db/migrate/#{Migration ID}_tmp.rb
class Tmp < ActiveRecord::Migration[5.1]
def change
end
end
再度statusコマンドで再確認し、NO FILEが消えていることを確認
$ bundle exec rake db:migrate:status
Status Migration ID Migration Name
--------------------------------------------------
up 20200707153004 Create users
up 20200711014336 Create groups
up 20200715054409 Create graphs
up 20200715072011 Add group id to graph
up 20200729104800 Add default temp3 to graph
up 20200729105435 Add default temp2 to graph
up 20200729124216 Add values to graphs
up 20200729124408 Tmp
NO FILEからTmpになってる
Tmpのマイグレーション履歴をdown statusに変更する
$ bundle exec rake db:migrate:down VERSION=#{Migration ID}
ステータスがdownになっていることを確認する
$ bundle exec rake db:migrate:status
database: ***/development.sqlite3
Status Migration ID Migration Name
--------------------------------------------------
up 20200707153004 Create users
up 20200711014336 Create groups
up 20200715054409 Create graphs
up 20200715072011 Add group id to graph
up 20200729104800 Add default temp3 to graph
up 20200729105435 Add default temp2 to graph
up 20200729124216 Add values to graphs
down 20200729124408 Tmp
マイグレーションファイルを削除する
$ rm -rf db/migrate/#{Migration ID}_tmp.rb
最後にステータスを確認
$ bundle exec rake db:migrate:status
database: ***/development.sqlite3
Status Migration ID Migration Name
--------------------------------------------------
Status Migration ID Migration Name
--------------------------------------------------
up 20200707153004 Create users
up 20200711014336 Create groups
up 20200711085035 Create device data
up 20200715054409 Create graphs
up 20200715072011 Add group id to graph
up 20200729104800 Add default temp3 to graph
up 20200729105435 Add default temp2 to graph
up 20200729124216 Add values to graphs
履歴自体が消えて、失敗前に戻った🎉