heroku run rails db:migrateが効かなかった時の対処法
2分目次
本番環境での migrate が効かない原因は多種多様だろうけど、当記事のケースはまず間違いなく汎用性というか普遍性が低いと思う。僕が不良行為を働いていたことに起因する。
経緯
[hoge:~/hoge]$ heroku run rails db:migrate
Running rails db:migrate on ⬢ hoge... up, run.6178 (Free)
(略
== 20190720055110 CreateComments: migrating ===================================
-- create_table(:comments)
(略
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
(略
PG::UndefinedTable: ERROR: relation "topics" does not exist
(略
めっちゃ怒られた。マイグレーションできなかった。主要な箇所を書き出すなら、明らかにこの部分。
PG::UndefinedTable: ERROR: relation "topics" does not exist
要は「あるテーブル(comments)のリレーション先のテーブル(topics)がないよ」ということ。
肝心のエラーの原因だが、ファイル数をなるべく少なくするため(ファイル増えると個人的に見辛かったしそんなことがこんなふうになるなんて知る由もなかった)に、rails g migration AddHogeColumnToHoge
といったカラムの追加方法ではなく、元のマイグレーションファイルの最後部に付け足したいカラムを足していってrails db:migrate:reset
していたことだろう。
- comments テーブル作成される
- topics テーブル作成される
- comments テーブルに topics テーブルへのリレーションのカラム追加される
といった順序で処理が行われ、これであれば正常に通る。しかしながら僕の場合は先に述べた謎の方法を取ってしまっていたためか、
- comments テーブル作成 & topics テーブルへのリレーションカラム作成
- topics テーブル作成
という流れになっており、topics テーブルがない状態ながら comment テーブルに topics テーブルへのリレーションカラムを追加しようとしてしまったために出てしまったエラーなのかなと推測した。つまり、マイグレーションファイルの並び順をこのエラーが出ないようにソートすれば良いんじゃないかと考えた。(というか普通に規約とか慣習に沿えば良かっただけという話。教訓になった)
というわけで migrate ディレクトリの中のファイルをソートしていく。rails g migrate
では作成された日時がファイル冒頭につくため、これを変更した。
元は
20190720075110createcomments.rb 20190720081148createtopics.rb
という並びで、これだと数字の若い comment ファイルから先に実行されてしまうためこれを topic ファイルの後に持っていくために数字を入れ替えた。するとうまいこと
20190720075110createtopics.rb 20190720081148createcomments.rb
という並び順に。これで再度$ heroku run rails db:migrate
を実行。うまくいった。
教訓:特に理由もないのに変なことをすると痛い目に遭う