はじめに
実装している途中にDBテーブルに外部キーを追加する必要がありました。
いつものようにmigrationファイルを作成し、rails db:migrateを行ったところ下記のエラーメッセージが返ってきました。
~ # bundle exec rails db:migrate
Running via Spring preloader in process 1242
== 20221007040407 {migrationファイル名}: migrating ===============
-- add_reference(:テーブル名, :カラム名, {:null=>false, :foreign_key=>true})
rake aborted!
StandardError: An error has occurred, all later migrations canceled:
Mysql2::Error: Duplicate column name ‘{追加したかったカラム名}’
原因がよくわからず、エラー解消まで少し時間がかかったので備忘録として残そうと思います。
結論:
作成したmigrationファイルの記述を消して、一旦rails db:migrateを叩くとschema.rbに反映がされる。
反映後、migrationファイルに元の記述加えればOK
#エラーが起きたmigrationファイルの中身
class Add"カラム名"To"テーブル名" < ActiveRecord::Migration[6.1]
def change
add_reference :"テーブル名", :"カラム名", null: false, foreign_key: true
end
end
手順
#change内の記述を空にする
class Add"カラム名"To"テーブル名" < ActiveRecord::Migration[6.1]
def change
#空白にしてdb:migrateを行う
end
end
#空白でdb:migrateを行なってから記述を戻す
class Add"カラム名"To"テーブル名" < ActiveRecord::Migration[6.1]
def change
add_reference :"テーブル名", :"カラム名", null: false, foreign_key: true
end
end
なぜエラー解消まで時間がかかったのか
"Mysql2::Error: Duplicate column name ‘{追加したかったカラム名}’"をネットで検索すると、結論で記載した解決法が書かれている記事はすぐに見つかります、実際すぐに解決できると思うのですが僕は時間がかかってしまいました。
その理由は、記事の多くは「"rails db:migrate"は失敗するけど、migrationはできている」という前提があって解消法が書かれていたことです。
僕のschema.rbはエラーが出た後も更新されておらず、前提である「migrationができていない」と考え、別に原因があると考え立ち止まってしまいました。
少し悩んだ後、失敗しても元に戻せばいいかと思いmigrationファイルを空白にして"rails db:migrate"をしたところ無事にschema.rbに反映がされました。
終わりに
同じ箇所で悩んでいる方の力になれればと思いqiitaに書きましたが、
正直、原因と解決した理由がいまいちわかっていない状態で少しモヤモヤしています。
もし詳しいことがわかる方がいらっしゃいましたらご教示いただけるとありがたいです。。
参考