エラーPG::UndefinedTable: ERROR: relation "XXXXXX" does not existについて


エラーの詳細

herokuへのデプロイのため「% git push heroku master」を実行し、
下記のコマンドを実行した際のエラー
※自分が実際に行った過程はデプロイのリンク先ページにのっています。

 

ターミナル
% heroku run rake db:migrate

上記のコマンドを実行した後のエラーが以下

ターミナル(エラー文の一部分)
PG::UndefinedTable: ERROR: relation "XXXXXX" does not exist
#"XXXXXX"にはテーブル名

以下省略

エラー文の解釈

中間テーブル名がエラー文に入っていたことから、
テーブル関係のエラーだとわかる。

ローカルでは正常に作動していたため、
本番環境でしか出会わないエラーがあるというのが今回だと思う。

 

原因

マイグレーションファイルの作成する順番を間違えていたから。(herokの場合の現象)

解説

herokでのマイグレート(% heroku run rake db:migrate)は
作成した日付順に行われる。

<例>「20200912095202_create_song_discs.rb」
マイグレーションファイルの頭の文字は作成された年月日で決められる。
(この部分をバージョンとするらしい。)

今回は先に中間テーブル(song_discsテーブル)に関するファイルを作成し、
後にそのテーブルに関するテーブル(discsテーブル)に関するファイルを作成した。
その為に起きたエラーでになる。
要するに、中間テーブルは後で作れってことだと思う。

※マイグレーションファイルの作成優先順位がどうあるべきなのかまた詳しく調べたい。

 

対処方法

①中間テーブルの作成日を後にする為、一旦中間テーブルに関するマイグレーションファイルを削除

②中間テーブルに関する他のテーブルの作成日が削除によって先になったところで、改めて中間テーブルを作成

③改めてローカルでマイグレーション % rails db:migrate

④再度デプロイまでの工程をして完成!!

 
 

対処の流れ(コマンド)

前提

中間テーブルのマイグレーションファイル内に記述してしまっている。
そのファイルを触って作業する為、内容がなくなっても困らないように別場所にコピー(バックアップ)をしている。
  
❗️必ず読んでください❗️
ファイルの作成順を変える為の工程として、
ファイルを削除します!中身も消えます!
「ファイル内の記述をそのまま使用したい!」
「内容は変更したくない!」
という人はこの時点でどこかにファイル内の記述をコピー(バックアップ用)してください。
ファイルの削除を実行した時点で内容は破棄されますので御注意ください。
 
 
  

マイグレーションファイルの作成された順番を確認

このコマンドで履歴を確認する事ができる

ターミナル
% bundle exec rake db:migrate:status

Migration ID を確認するとバージョンが分かり、
作成された順番で並んでいる。

database: アプリ名_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200723033017  Devise create users
   up     20200727050028  Create songs
   up     20200731024511  Create user songs
   up     20200801063906  Create songcolors
  down    20200821150924  Create song discs ←中間テーブルが先に作成されてる。
   up     20200821160923  Create discs

  
  

不要なマイグレーションファイルを削除

今回song_discsという中間テーブルを先に作成してしまったので
そのファイルを作り直す為に削除。

マイグレーションファイルを削除する前に確認事項

削除したいファイルStatusが「down」になっている必要がある。

database: アプリ名_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200723033017  Devise create users
   up     20200727050028  Create songs
   up     20200731024511  Create user songs
   up     20200801063906  Create songcolors
  down    20200821150924  Create song discs
   up     20200821160923  Create discs

上記の例のこうに「down」であればこのまま削除作業へ進み
「up」であれば「down」に変更してから削除する。
(「VERSION=削除したいファイルのマイグレーションID」削除可)

Statusをdownするコマンドの例
% rails db:migrate:down VERSION=20200821150924

 

マイグレーションファイルの削除の実行 

マイグレーションファイルの名前そのままコピーしてきた方が確実かもしれないです。

ターミナル
% rm -rf db/migrate/削除したいファイル名
% rm -rf db/migrate/20200821150924_create_song_discs.rb

 
 

削除されているか確認

再度「% bundle exec rake db:migrate:status」
消えていれば削除成功

database: アプリ名_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200723033017  Devise create users
   up     20200727050028  Create songs
   up     20200731024511  Create user songs
   up     20200801063906  Create songcolors
   up     20200821160923  Create discs

 
  

改めて削除したマイグレーションを作成

マイグレーションファイルのみを作成するコマンドを実行する。

ターミナル
% rails g migration 作成したいマイグレーションファイルの名前 
% rails g migration create_song_discs     

出来上がるファイル例は「20200912095202_create_song_discs.rb」
createの入れ忘れに注意!

ここで「% bundle exec rake db:migrate:status」で履歴確認しておくと安心です。

 
 

作成したマイグレーションファイル内を編集

データベースマイグレーションの前に必要な内容があれば編集
(前提で記載しておいた内容です。)

今回の私の場合は内容は削除したファイル内と変わらない為、
あらかじめコピーし保存しておいたものをそのまま貼り付けました。

  

データベースにマイグレーション

Statusが「down」のままではいけないので以下のコマンドをして
「up」に変えます。

 % rails db:migrate  

※マイグレーションファイル内の書き換えだけだと「% rake db:rollback」を実行して
以下のコマンドで更新してあげるだけ。今回は削除が必要だったことを理解しておこう。
 
気になる方は「% bundle exec rake db:migrate:status」で「up」になっているか
確認してみてください。

 
あと、私はここでローカル環境でちゃんと動くか確認します!
ファイル触っているので、おかしくなってないか見て次の工程へ進みます。

 
 

再度herokuへデプロイする

ここまでくれば対処は完了していますので、
デプロイしてみてください!!

もし、どうやるんだっけ?という方がいれば是非こちらから

 
  

お疲れさまでした!!
デプロイ出来ましたでしょうか?
エラーの解決はとても嬉しいですよね!

  
  
  

ポイント

herokuのデプロイの場合、
マイグレーションファイルの作成順を気をつけること!
 

ひとことMemo

今回はとても勉強になりました。
何気なく作っていると「ここ理解してないままでしょあなた!」と言わんばかりにつまづきますね。
エラーってありがたいです。
記事を書いていると、新たに理解不十分が見つかりました。

①マイグレーションファイルの履歴で出てくる、「up」「down」について
②マイグレーションファイルの作成順の決まりについて(herokuに限るのか)

これについても気になるのでまた記事にしたいと考えてここに記録しておきます。

また、他にも解決方法を思いついて、
マイグレーションファイルを作成するさいのモデルを作成するコマンド(%rails g model モデル名)の逆で削除してやり直そうと思ったのですが必要以上に削除されるファイルがあって大変そうだったのでやめました!
削除コマンドって何が削除されるのか知らないといけないですよね〜
(当たり前か…笑)

  
  
では最後まで読んでいただき、
ありがとうございました!
また、お会いしましよう