マイグレーションのバージョンが重複しているエラーが発生した時の対処法について。
エラーの内容
エラーの内容は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
エラー対処法
エラーの対処法は次の流れになります。
重複しているファイルのどちらかを最新のバージョンに変更する
まずは重複しているファイルのバージョンを最新に変更します。
ここではファイル名を次のように修正しました。
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
変更したバージョン情報を内容が一致していれば完了です。
お疲れ様でした。