モデルを作ってrails db:migrateしようとしたらエラーに遭遇した件
タイトルのままなんですが、、、 一応開発環境とかも説明しておく
開発環境
マイグレーションファイル
モデル名 Task
テーブル名 tasks
カラム name:string
description:text
どのようなエラーが出た?
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
PG::DuplicateTable: ERROR: relation "tasks" already exists
英語が苦手というわけではないが、すらすら読めるわけではないので便利な「Deel」という翻訳アプリを使って翻訳してみた。
レールは中止されました !
エラーが発生し、これ以降のすべての移行がキャンセルされました。
"tasks" リレーションが既に存在する。
うーん。なるほど。多分めんどくさい。
マイグレーションファイルに問題がありそうなので、
rails db:migrate:statusコマンドでマイグレーションファイルの状態を確認してみよう。
database: taskleaf_development Status Migration ID Migration Name -------------------------------------------------- up 20201228122412 ********** NO FILE ********** up 20201230060553 ********** NO FILE ********** up 20201230061636 ********** NO FILE ********** up 20201230094313 ********** NO FILE ********** up 20201230095352 ********** NO FILE ********** up 20201230150314 ********** NO FILE ********** down 20210106145728 Create tasks
!?!?!?!?!?明らかにおかしい... まずこのNO FILEのマイグレーションファイルを全部削除して再度rails db:migrationを実行することにしようか。
上記の記事を参考にして、一度マイグレーションファイルをすべて削除し、綺麗な状態に戻そう。
再度 rails db:migrate:statusコマンドを叩き、
database: taskleaf_development Status Migration ID Migration Name --------------------------------------------------
この状態にしたらrails g model Task name:string description:text を実行し、rails db:migrateを実行してみる。
んんん???エラーが治らん...
マイグレーションをリセットするのを忘れてしまっていた。
rails db:migrate:resetを叩き、
rails db:migrate:statusを見てみると、
database: taskleaf_development Status Migration ID Migration Name -------------------------------------------------- up 20210106154208 Create tasks
しっかり動きました。
まとめ
マイグレーションファイルやデータベースはRailsと別の世界にあるので、データベースの世界にカラムが残ってたり、マイグレーションファイルを消しても内部で NO FILE みたいに残っていることがある。 焦らず、rails db:migrate:statusで、マイグレーションの状態を確認し、不要なファイルがあれば、削除。再度リセットする。ということを頭に入れて置くことが大事だと感じた。
〜完〜