【Rails】ActiveRecord::DuplicateMigrationVersionErrorの対処法を実例で解説。

rails-prograshi(プロぐらし)-kv Rails
記事内に広告が含まれていることがあります。

マイグレーションのバージョンが重複しているエラーが発生した時の対処法について。

エラーの内容

エラーの内容はdb > migrate配下のマイグレーションファイルのバージョンが被ったファイルが存在しているためです。

画面には次のようなエラー内容が表示されます。

ActiveRecord::DuplicateMigrationVersionError

Multiple migrations have the version number 20211508103372.
Extracted source (around line #1356):

        version, = migrations.group_by(&:version).find { |_, v| v.length > 1 }
        raise DuplicateMigrationVersionError.new(version) if version
      end

      def record_version_state_after_migrating(version)

ファイルを確認すると、db > migrate 配下に同じバージョン(ファイル名冒頭の数値)のファイルが存在していることがわかります。

▼ファイルの例


rails db:migrate:statusで状況を確認すると、バージョンが重複したところでステータスがDOWN(マイグレーション未実行)になっていることがわかります。

# rails db:migrate:status
   
   up     20211508103371  Create 
   up     20211508103372  Add key
  down    20211508103372  Create
  down    20211508103373  Add recipient
  down    20211508103374  Add status


エラー対処法

エラーの対処法は次の流れになります。

エラー対処法
  1. 重複しているファイルのどちらかを最新のバージョンに変更する。
  2. rails db:migrate:statusで上位ファイルがdownの状態になっていることを確認
     ※UPになっていたら、rails db:migrate:downでrollbackする。
  3. rails db:migrateを実行する。
  4. schema.rbのバージョン定義が指定した日付になっているか確認する。
    ┗ ActiveRecord::Schema.define(version: yyyy_mm_dd_ssssss) となっていることを確認


重複しているファイルのどちらかを最新のバージョンに変更する

まずは重複しているファイルのバージョンを最新に変更します。

ここではファイル名を次のように修正しました。

20211508103372_create_article_rankings.rb
  ↓
20211508103382_create_article_rankings.rb

変更したファイルがdb > migrate ディレクトリの名前順の一番下になります。


rails db:migrate:statusで上位ファイルがdownの状態になっていることを確認

# rails db:migrate:status
   
   up     20211508103371  Create 
   up     20211508103372  Add key
  down    20211508103373  Add recipient
  down    20211508103374  Add status
  (省略)
  down    20211508103381  Create perm
  down    20211508103382  Create article rankings

変更したバージョンが一番下にきてDOWNになっています。


rails db:migrateを実行する

この状態でrails db:migrateを実行します。

# rails db:migrate

(省略)
== 20211508103382 CreateArticleRankings: migrated (0.0201s) ===================

D, [2021-11-22T03:58:12.883899 #351] DEBUG -- :   ActiveRecord::SchemaMigration Create (0.6ms)  INSERT INTO "schema_migrations" ("version") VALUES ('20211508103382') RETURNING "version"
D, [2021-11-22T03:58:12.884683 #351] DEBUG -- :   ↳ lib/active_record/connection_adapters/postgresql_adapter_patch.rb:28:in `execute_and_clear'
D, [2021-11-22T03:58:12.886554 #351] DEBUG -- :   TRANSACTION (1.6ms)  COMMIT
D, [2021-11-22T03:58:12.891498 #351] DEBUG -- :   ActiveRecord::InternalMetadata Load (0.8ms)  SELECT "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = 'environment' LIMIT 1
D, [2021-11-22T03:58:12.892001 #351] DEBUG -- :   ↳ lib/active_record/connection_adapters/postgresql_adapter_patch.rb:28:in `execute_and_clear'
D, [2021-11-22T03:58:12.897437 #351] DEBUG -- :    (1.3ms)  SELECT pg_advisory_unlock(2167604979718042620)
D, [2021-11-22T03:58:12.936563 #351] DEBUG -- :    (2.0ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
D, [2021-11-22T03:58:12.936872 #351] DEBUG -- :   ↳ lib/active_record/connection_adapters/postgresql_adapter_patch.rb:28:in `execute_and_clear'

#

マイグレーションが完了しました。



DuplicateTable: ERROR: relation already existsが発生した場合

マイグレーションの実行中に、既にテーブルが生成済みの場合はDuplicateTable: ERROR: relation already existsというエラーが発生します。

その場合は下記をご参照ください。

(参考)【Rails】エラー対処法:PG::DuplicateTable: ERROR: relation already exists


schema.rbのバージョン定義が指定した日付になっているか確認する

最後にschema.rbのバージョン定義が指定した日付になっているか確認します。

db > schema.rbファイルを開いて、13行目あたりを確認します。

ActiveRecord::Schema.define(version: 2021_15_08_103382) do

変更したバージョン情報を内容が一致していれば完了です。

お疲れ様でした。

タイトルとURLをコピーしました