エラー詳細
GitHubでMerge後、renderにて自動デプロイ失敗
Caused by:
PG::UndefinedTable: ERROR: relation "xxxx(テーブル名)" does not exist (PG::UndefinedTable)
(省略)
==> Build failed
ローカルでは問題なく動いてた。
"xxxx"テーブル関係が存在しないとのことなので心当たりを探っていく
原因
色々試したけど、結果マイグレーションファイルのup順が原因でした。
% rails db:migrate:status
マイグレーションのステータスを確認
database: APP_development
Status Migration ID Migration Name
--------------------------------------------------
up 20241113021323 Devise create users
up 20241119002039 Create vvvv
up 20241119011527 Create wwww
up 20241129062819 Create yyyy
up 20241205063125 Create xxxx
このYYYYテーブルにxxxxの外部キー書いてたから起きたエラーでした。
順番通り読まれてYが「Xが見当たらないよ!」ってことかな。
class Createyyyy < ActiveRecord::Migration[7.0]
def change
create_table :yyyy do |t|
t.string :phone, null: false
t.references :xxxx, null: false, foreign_key: true
t.timestamps
end
end
end
原因がわかったのでマイグレーションファイルの順番を変えて行きます。
対処法
1.マイグレーション一覧を確認
% rails db:migrate:status
database: APP_development
Status Migration ID Migration Name
--------------------------------------------------
up 20241113021323 Devise create users
up 20241119002039 Create vvvv
up 20241119011527 Create wwww
up 20241129062819 Create yyyy
up 20241205063125 Create xxxx
2.yyyyテーブルを削除する
yyyyテーブルを削除するためにStatusをdownする。
rails db:migrate:down VERSION = Migration ID
再度ステータスを確認してdownになってたら削除コマンド
その前に!
順番だけ変えたいのであって中身は変えないのでファイルの内容コピーしてメモに貼っておきます!
% rm -rf db/migrate/削除したいファイル名 (今回なら20241129062819_create_yyyy)
ステータス確認してテーブルが消えていればOK
3.yyyyテーブルを作り直す
%rails g migration create_yyyy
でマイグレーションファイルを作りなおして、メモにコピーしていた前述の内容を貼り付け、
Statusをupにすれば出来上がりです
%rails db:migrate
念のためここでもステータスを確認。 これで無事デプロイできました!
余談
マイグレーションファイルの順番で関係あるんですね...
多分ファイル作る時気付けるかもしれないんだけど、
今回の外部キー制約は抜け漏れてて、一度rollbackして足したから
作る時点で気づけなかったんだろうなぁ。
初心者なんで、もっとこうしたほうが〜とかあったらぜひ教えていただきたいです。
よろしくお願いします。