Ruby on Rails

[Rails5] PG::DuplicateTable: ERROR~の解決方法

この記事では、Ruby on Rails5のマイグレーション時に起きた

StandardError: An error has occurred, this and all later migrations canceled:
PG::DuplicateTable: ERROR: relation “accounts” already exists

というエラーの解決方法について書いています。

使用環境

ruby ‘2.5.1’

gem ‘rails’, ‘~> 5.2.1’

gem ‘pg’, ‘>= 0.18’, ‘< 2.0’

エラーの意味

このエラーは文字通り、「データベースに(既に存在するのと)同じテーブルを作成しようとしているよ」という意味です。データベースの中には同一の名前のテーブルが存在出来ないということですね。

エラーの背景

ユーザーに紐づく「account」というモデルを作成しました。その中に「slug」 というカラムを用意したつもりが、「slag」 とタイポしていたので、マイグレーションファイルを修正。しかし、そのマイグレーションファイルはモデル作成時に作られる create_tableなので、ここで一回マイグレーションファイルを消します。で、その後コンフリクトさせるようにもう一度モデルを作成。(上書きしようと考えた)

その後 rails db:migrate を叩くと、上のエラーが出てくるわけですね。

これは単純にデータベースの中にはまだaccountsテーブルが残っているのにmigrateしようとしたからですね。

エラーの解決方法

データベースを一度リセットします。

コマンドは簡単で、 rails db:migrate:reset  です。

すると

k1r0hi@kirohi-CFSZ6-1L:~/Ruby/Rails-API/invoiced$ rails db:migrate:reset
Dropped database ‘invoiced_development’
Dropped database ‘invoiced_test’
Created database ‘invoiced_development’
Created database ‘invoiced_test’
== 20190214034650 CreateContacts: migrating ===================================
— create_table(:contacts)
-> 0.0201s
== 20190214034650 CreateContacts: migrated (0.0202s) ==========================

== 20190214051932 DeviseCreateUsers: migrating ================================
— create_table(:users)

~~~~~~~~~~~~~~~~~~~~~~~~~略~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

という感じで、一度データベースを丸ごと Dropした後にCreateされます。

ちゃんと直ってて、良い感じですね!!

残っていた accountsテーブルを削除しつつ、新しいaccountsテーブルを作っているという感じですね。もちろん同時に他のテーブル(userテーブルとか)も再構築されます。

 

エラー時に頼りたいサービス

こちらの記事にエラーが出た時に頼りたいサービスをまとめています!

あわせて読みたい
プログラミングのエラーが直らない時に使うべきサービス4選 という悩みを解決するサービスを4つ紹介します。 プログラミングにエラーはつきもので、誰もが悩まされます。何...