駆け出しエンジニアの気ままブログ

気になったことについて、調べながら投稿するブログです。

migrationファイルがNO-FILEになったときの対処

概要

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テーブル作成

まとめ

この現象が起きたときは焦ってしまいましたが、先輩の説明から理解が深まりました。

最後まで読んでいただき、ありがとうございました!