heroku run rails db:migrateが効かなかった時の対処法

heroku run rails db:migrateをしようとしたら……

[hoge:~/hoge]$ heroku run rails db:migrate
Running rails db:migrate on ⬢ gizzlogg... 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していたことだろう。

本来はrails db:migrateをすると

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

といった順序で処理が行われ、これであれば正常に通る

しかしながら僕の場合は先に述べた謎の方法を取ってしまっていたためか、

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

という流れになっており、topicsテーブルがない状態ながらcommentテーブルにtopicsテーブルへのリレーションカラムを追加しようとしてしまったために出てしまったエラーなのかなと推測した。

つまり、マイグレーションファイルの並び順をこのエラーが出ないようにソートすれば良いんじゃないかと考えた。(というか普通に規約に沿えば良かったんだろうけど)

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

元は

20190720075110_create_comments.rb
20190720081148_create_topics.rb

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

するとうまいこと

20190720075110_create_topics.rb
20190720081148_create_comments.rb

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

うまくいった。

コメントを残す

メールアドレスが公開されることはありません。