Rails 7で保留中の移行エラーを解決する方法
概要
誤って “created_at” の列を複製した移行を作成しました。現在、画面にこのエラーが表示されています。重複を削除した後、重複を削除する前もエラーは同じでした。
これは端末メッセージです。
PS C:\Users\iamvee_k\Desktop\Rails Projects\blog> rails db:migrate
== 20231003192318 AddTimestampsToArticles: migrating ==========================
-- add_column(:articles, :created_at, :datetime)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
SQLite3::SQLException: duplicate column name: created_at
C:/Users/iamvee_k/Desktop/Rails Projects/blog/db/migrate/20231003192318_add_timestamps_to_articles.rb:3:in `change'
Caused by:
ActiveRecord::StatementInvalid: SQLite3::SQLException: duplicate column name: created_at
C:/Users/iamvee_k/Desktop/Rails Projects/blog/db/migrate/20231003192318_add_timestamps_to_articles.rb:3:in `change'
Caused by:
SQLite3::SQLException: duplicate column name: created_at
C:/Users/iamvee_k/Desktop/Rails Projects/blog/db/migrate/20231003192318_add_timestamps_to_articles.rb:3:in `change'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
これが出力画面です。
解決策
移行ファイルは表示されませんでしたが、元の移行に t.timestamps という行があれば、created_at は updated_at とともにすでに作成されています。
created_at と updated_at の両方が不要な場合は、その行を削除し、そのうちの 1 つを明示的に定義します (例: t.datetime :created_at)。
移行を変更した後、次の手順を実行します (ローカル データが消去されます)。
rake db:drop
rake db:create
rake db:migrate
ローカルでは、ロールバックなどについて心配する必要はありません。 DB 全体を消去するだけで、新たに開始し続けることができます。ローカルではこれで問題ありません。それがシード データのポイントであり、アプリを再シードし続け、移行を変更するたびにデータベースをワイプしてクリアすることであるからです。アプリがまだ起動していないときに移行ファイルを追加し続ける理由はありません
運用環境でこの問題が発生した場合、私は何百もの不必要な移行が嫌いなので、データベースを常に手作業で編集しています。
したがって、運用環境では、基本的に必要な移行変更をローカルでコミットし、それらを心の中で書き留めます。次に、実稼働データベースを GUI で開き、同じ GUI 内でローカルにデータベースが表示される方法と一致するように、必要に応じて変更します。これは、すべての変更に関する複雑な監査ログを必要としない小規模なアプリに適しています。