概要
migrationをしよう、もしくはロールバックしようと思ったときにでくわす
up 20240228201536 ********** NO FILE **********
ファイルが無いため、何もできない状態になったときの対処法について書きたいと思います
原因
開発中にはよくあることだと思いますが、ブランチ毎に機能開発を行っています。
mainブランチやreleaseブランチの親ブランチにその変更が取り込まれていない状態で、それらのブランチから新たな機能開発用のブランチを作成することで発生します。
migrationファイルはgithubと連携していますが、ローカルDBはgithubと連携していません。
そして、DBではschema_migrationというテーブルでmigrationファイルの日時のみを管理しています。この差により日時は存在しているが、migrationファイルは無いという減少が発生します。
main → feature1 (migrationファイル作成 postテーブル追加) ↓ → feature2(migrationファイル作成 tagテーブル追加)
このような形でブランチ作成を行った際、各ブランチ毎に作成されているmigrationファイルは異なります。
feature1ブランチでは、postテーブル追加のためのmigrationファイル
feature2ブランでは、tagテーブル追加のためのmigrationファイル
ローカル環境は feature1 を先に開発し終わり、 feature2を新たにmainブランチから作成していました。
この状態で各ブランチ毎にrails db:migrate:status
で確認してみると、
feature1ブランチ
up 20240222134503 postテーブル作成
feature2ブランチ
up 20240222134503 *********NO FILE************** up 20240223113423 postテーブル作成
このようになるかと思います。
feature1ブランチがmainブランチ取り込まれており、その後でfeature2ブランチをmainブランチから作成した場合は、発生しません。
対処
feature1ブランチで、ロールバックする必要があります。ロールバックはmigrationファイルを削除することではなく、DBへの反映を削除することができます。
feature1ブランチ
コマンドは、
// 直前のmigrationファイルであれば、これで問題ない $ bundle exec rails db:rollback // さらに古いmigrationファイルで、指定したい場合 $ bundle exec rails db:migrate:down VERSION=<削除するmigrationファイルの日時>
実行後に、feature2ブランチに移動すると、下記のようになっていると思います。
feature2ブランチ
up 20240223113423 postテーブル作成
まとめ
この現象が起きたときは焦ってしまいましたが、先輩の説明から理解が深まりました。
最後まで読んでいただき、ありがとうございました!