あまブログ

ドキドキ......ドキドキ2択クイ〜〜〜〜〜〜〜ズ!!

【Rails】マイグレーションでNO FILEが表示された時の対処法

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

以上です。


【参考】