rails db:migrate をすると出るPG::DuplicateColumn: ERROR の対処
起きたエラー
テーブルをいじっていていろいろミスったので、git reset --hard
をして再度rails db:migrate
コマンドを打つと、次のエラーが出た。
PG::DuplicateColumn: ERROR: column "user_id" of relation "pages" already exists
「pagesテーブルにuser_id
カラムを加えようとしてるけど、もうすでに存在してるよ〜」という意味。同じ名前のカラムを同一のテーブルに2つ以上作れません。
原因
以下、エラーが起きるまでにやったこと。
- マイグレーションファイルをつくり、
db:migrate
した - ミスっていたことに気づき、
git reset
をした - マイグレーションファイルは削除され、schema.rbにも該当するカラムの記載はない
- もう一度マイグレーションファイルを作り、
db:migrate
した - 上記エラーが出た
「え、git reset
したら戻してくれるんじゃないの?」と思ったが、そうではないみたい。
つまり、pagesテーブルにはuser_idがすでに存在しているのにも関わらず、マイグレーションを実行しようとして起きたエラーだった。
対処
データベースやスキーマファイルを一度削除し、すべてのマイグレーションを実行する。
bin/rails db:migrate:reset
ただし、これだと初期データも失われるのため、それまで使用していたログインユーザーの情報も消える。
再度db:fixtures:load
をする必要があるかもしれないが、その場合は二度手間になる。
コマンド一発でやりたかったので、rails db:reset
をした。
bin/rails db:reset
これは、データベースの削除・再作成、初期データの登録まですべてやってくれる。
コマンドでいうと次のとおり。