この記事では、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テーブルとか)も再構築されます。
エラー時に頼りたいサービス
こちらの記事にエラーが出た時に頼りたいサービスをまとめています!
https://kirohi.com/four_service_to_fix_error