しおブログ言うてますけど

技術ブログ言うてますけど技術以外のことも発信すると思われ。RubyとかRuby on Railsとか生き方とかジャンルにこだわらず自分の好きなように。初心者なのでお手柔らかに。

モデルを作ってrails db:migrateしようとしたらエラーに遭遇した件

タイトルのままなんですが、、、 一応開発環境とかも説明しておく

開発環境

Rails 5.2.4
Ruby 2.5.0

マイグレーションファイル

モデル名 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を実行することにしようか。

qiita.com

上記の記事を参考にして、一度マイグレーションファイルをすべて削除し、綺麗な状態に戻そう。

再度 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で、マイグレーションの状態を確認し、不要なファイルがあれば、削除。再度リセットする。ということを頭に入れて置くことが大事だと感じた。

〜完〜