WordPressテーマ『十二単』リリース 🎉

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

本番環境でのmigrateが効かない原因は多種多様だろうけど、当記事のケースはまず間違いなく汎用性というか普遍性が低いと思う。僕が不良行為を働いていたことに起因する。

もくじ

経緯

heroku run rails db: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していたことだろう。

本来の方法を取っていれば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を実行。うまくいった。

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

CTAエリアイメージ

WordPressテーマ『十二単』

無料のWordPressテーマです。絶賛開発中。
詳しくみる

✒️ Writer ✒️

たかさき

しがないたかさきです。HTML/CSS/JS/PHP/Ruby/SQLちょっと書けます、Photoshopちょっと使えます。Vue勉強中、埼玉とか都内の勉強会良いのあれば教えてください〜。メディア売買経験あります、ミドルレベルでの検索結果1位何回か取ったことあります。詳しくはこちら

Follow Me:)

COMMENT

コメントする

入力エリアすべてが必須項目です。メールアドレスが公開されることはありません。


内容をご確認の上、送信してください。