エラーの詳細
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」削除可)
% 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へデプロイする
ここまでくれば対処は完了していますので、
デプロイしてみてください!!
もし、どうやるんだっけ?という方がいれば是非[こちらから]
(https://qiita.com/kusaharajiji/items/9287235d56843c03734c)!
お疲れさまでした!!
デプロイ出来ましたでしょうか?
エラーの解決はとても嬉しいですよね!
#ポイント
herokuのデプロイの場合、
マイグレーションファイルの作成順を気をつけること!
#ひとことMemo
今回はとても勉強になりました。
何気なく作っていると「ここ理解してないままでしょあなた!」と言わんばかりにつまづきますね。
エラーってありがたいです。
記事を書いていると、新たに理解不十分が見つかりました。
①マイグレーションファイルの履歴で出てくる、「up」「down」について
②マイグレーションファイルの作成順の決まりについて(herokuに限るのか)
これについても気になるのでまた記事にしたいと考えてここに記録しておきます。
また、他にも解決方法を思いついて、
マイグレーションファイルを作成するさいのモデルを作成するコマンド(%rails g model モデル名)の逆で削除してやり直そうと思ったのですが必要以上に削除されるファイルがあって大変そうだったのでやめました!
削除コマンドって何が削除されるのか知らないといけないですよね〜
(当たり前か…笑)
では最後まで読んでいただき、
ありがとうございました!
また、お会いしましよう