発生したエラー内容
データベースにカラムを追加しようとすると次のメッセージが表示され処理が中断された。
「duplicate column name」とあるのでカラムが重複しているらしい。
$ rails db:migrate
== 20200311131021 AddRememberDigestToUsers: migrating =========================
-- add_column(:users, :remember_digest, :string)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
SQLite3::SQLException: duplicate column name: remember_digest
#中略
bin/rails:4:in `<main>'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
原因の確認
1. /db/migrateでマイグレーションファイルの確認
重複した記述は見られず。
2. データベースの確認
$ rails db
sqlite> .schema Users
CREATE TABLE IF NOT EXISTS "users" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "email" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "password_digest" varchar, "remember_digest" varchar);
作成しようとした「remember_digest」カラムがすでに存在した。...なぜ?
3. マイグレーションの実行状況を確認
$ rails db:migrate:status
database: db/development.sqlite3
Status Migration ID Migration Name
--------------------------------------------------
up 20200229035424 Create users
up 20200229052320 Add index to users email
up 20200229053658 Add password digest to users
up 20200307032712 ********** NO FILE **********
down 20200311131021 Add remember digest to users
NO FILEがある...
ここでやっと気づきました。
一度git resetをしていたのでマイグレーションファイルは削除されたがデータベースには手を加えていないのでそのままになっていたようです。
解決方法
正しい方法かはわからないですが以下の手順で解決しました。
データベースに登録されているデータは全て消えるので注意が必要です。
$ rails db:reset # データベースの再作成
$ rails db:migrate:status # マイグレーションファイルの確認
database: db/development.sqlite3
Status Migration ID Migration Name
--------------------------------------------------
up 20200229035424 Create users
up 20200229052320 Add index to users email
up 20200229053658 Add password digest to users
down 20200311131021 Add remember digest to users
$ rails db:migrate # まだ適用されていなかったマイグレーションファイルの適用