1. はじめに
rails db:migrate:status
を実行すると、時々NO FILE
と表示されることがある。
up 20230331081736 ********** NO FILE **********
- 主に以下のパターンの時に
NO FILE
のマイグレーションが表示される- migrate実行後に誤ってマイグレーションファイルを削除してしまった場合
- マイグレーション実行後にロールバックをせずにブランチを切り替えた場合
この記事では、NO FILE
のマイグレーションを修正する方法について解説します。
2. 検証環境
- macOS:13.4
- Ruby:3.1.0
- Rails:6.1.4.7
- git:2.39.1
3. 対処法
対処法は以下の3パターンです。
- ダミーのマイグレーションファイルを作成する(基本的にこれで対応可能)
schema_migrations
テーブルのレコードを削除する- マイグレーションを実行したブランチでロールバックする(ブランチ切り替えが原因の場合のみ)
対処法1:ダミーのマイグレーションファイルを作成する
まず、マイグレーションのステータスを確認します。
$ rails db:migrate:status database: sample Status Migration ID Migration Name -------------------------------------------------- up 20230312200635 XXXXXX up 20230331081736 ********** NO FILE ********** up 20230504083810 XXXXXX
20230331081736
のところに NO FILE が表示されています。
次に、ダミーのマイグレーションファイルを作成します。
$ touch db/migrate/20230331081736_foo.rb
作成したdb/migrate/20230331081736_foo.rb
を以下のように修正します。(class
を適当な名前に変更しないと後に実行するrails db:migrate:down
でエラーが発生します)
class Foo < ActiveRecord::Migration[6.1] def change end end
再度マイグレーションのステータスを確認します。
$ rails db:migrate:status database: sample Status Migration ID Migration Name -------------------------------------------------- up 20230312200635 XXXXXX up 20230331081736 Foo up 20230504083810 XXXXXX
Migration NameがFoo
に変わっていることが確認できます。
以下のコマンドでマイグレーションをダウンさせます。
$ rails db:migrate:down VERSION=20230331081736
再度マイグレーションのステータスを確認します。
$ rails db:migrate:status database: sample Status Migration ID Migration Name -------------------------------------------------- up 20230312200635 XXXXXX down 20230331081736 Foo up 20230504083810 XXXXXX
20230331081736
のマイグレーションがダウンしていることが確認できます。
次に、作成したダミーファイルを削除します。
$ rm db/migrate/20230331081736_foo.rb
最後に、マイグレーションのステータスを確認します。
$ rails db:migrate:status database: sample Status Migration ID Migration Name -------------------------------------------------- up 20230312200635 XXXXXX up 20230504083810 XXXXXX
20230331081736
のマイグレーションがなくなっていることが確認できます。
対処法1は以上です。基本的にこの方法で解決します。
対処法2:schema_migrations
テーブルのレコードを削除する
別の方法として、データベースを直接変更する方法もあります。
まず、dbコンソールを起動します。
$ rails dbconsole
次に、NO FILE
が表示されているマイグレーションのid(20230331081736
)を指定して、レコードを削除します。
sample=# DELETE FROM schema_migrations WHERE version = '20230331081736';
この後rails db:migrate:status
を実行して、20230331081736
のマイグレーションがなくなっていることが確認できます。
対処法3:マイグレーションを実行したブランチでロールバックする
この対処法は、NO FILE
のマイグレーションがブランチ切り替えによって発生した場合にのみ有効です。
まず、マイグレーションファイルを作成したコミットを特定します。
$ git log --all --stat -- '**/20230403001427*' commit 0c80bb7f2331063d124a9c08176f314448037704 (省略)
次に、そのコミットが含まれるブランチを特定します。
$ git branch --contains <COMMIT_HASH> feature/2
特定したブランチに切り替えます。
$ git checkout feature/2
マイグレーションをダウンさせます。
$ rails db:migrate:down VERSION=20230403001427
db/schame.rb
の変更を破棄します。
$ git checkout db/schema.rb
最後に、元のブランチに切り替えて作業を終了します。
$ git checkout feature/1
以上です。
【参考】