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していたことだろう。

  1. comments テーブル作成される
  2. topics テーブル作成される
  3. comments テーブルに topics テーブルへのリレーションのカラム追加される

といった順序で処理が行われ、これであれば正常に通る。しかしながら僕の場合は先に述べた謎の方法を取ってしまっていたためか、

  1. comments テーブル作成 &  topics テーブルへのリレーションカラム作成
  2. topics テーブル作成

という流れになっており、topics テーブルがない状態ながら comment テーブルに topics テーブルへのリレーションカラムを追加しようとしてしまったために出てしまったエラーなのかなと推測した。つまり、マイグレーションファイルの並び順をこのエラーが出ないようにソートすれば良いんじゃないかと考えた。(というか普通に規約とか慣習に沿えば良かっただけという話。教訓になった)

というわけで migrate ディレクトリの中のファイルをソートしていく。rails g migrateでは作成された日時がファイル冒頭につくため、これを変更した。

元は

20190720075110createcomments.rb 20190720081148createtopics.rb

という並びで、これだと数字の若い comment ファイルから先に実行されてしまうためこれを topic ファイルの後に持っていくために数字を入れ替えた。するとうまいこと

20190720075110createtopics.rb 20190720081148createcomments.rb

という並び順に。これで再度$ heroku run rails db:migrateを実行。うまくいった。

教訓:特に理由もないのに変なことをすると痛い目に遭う

  • SNSでシェアしよう
  • Twitterでシェア
  • FaceBookでシェア
  • Lineでシェア
  • 記事タイトルとURLをコピー
トップへ戻るボタン

\ HOME /

トップへ戻る