【PostgreSQL】エラー対処法:PG::DuplicateColumn: ERROR: column “ カラム名” of relation “テーブル名” already exists

PostgreSQL-prograshi(プロぐらし)-kv Database
記事内に広告が含まれていることがあります。

DBにPostgreSQLを使ったアプリケーションで、db:migrationを実行した時に次のようなエラーが発生した時の対処法について。

エラー内容

StandardError: An error has occurred, this and all later migrations canceled:

PG::DuplicateColumn: ERROR:  column “slug” of relation “articles” already exists

エラーの内容と原因

エラーは、現在マイグレーションしようとしているファイルに、カラムを追加する指示が入っているものの、対象のテーブルには既にそのカラムが存在している場合に発生します。

どういう時に発生するか?

例えば、ローカルでマイグレーションファイルを使って、テーブルにカラムを追加する処理を実行した後に、そのローカルの変更内容を破棄して(マイグレーションファイルを捨てて)、新たに取得してきたブランチの内容でマイグレーションを実行しようとした時に発生します。

マイグレーションファイルは、別のブランチのものになっているためキレイになっているのですが、DBの内容は変更されていないため、過去に追加したカラムが残っている状態です。


対処法

重複しているカラムを削除してから、マイグレーションを再度実行します。

▼PostgreSQLにおけるカラムの削除コマンド

ALTER TABLE テーブル名 DROP COLUMN カラム名;


実例

まずは、PostgreSQLのサーバーに入ります。

#Dockerを使っている場合はDBコンテナに入る
$ docker exec -it <DBコンテナ名> bash

#PostgreSQLの対話モードに入る
bash-4.4# psql -U postgres
psql (10.7)
Type "help" for help.

postgres=#


#DB一覧の表示
postgres=# \l


#DBの選択
postgres=# \c <DB名>
You are now connected to database "DB名" as user "postgres".

#カラムの削除
<DB名>=# alter table <テーブル名> drop column <カラム名>;
ALTER TABLE

以上で完了です。

カラムの確認

カラムが消えているか確認します。

#articlesテーブルのカラム一覧を表示
<DB名>=# \d <テーブル名>

これで、表示された一覧の中にカラムが存在していなければOKです。

マイグレーションの実行

あとは、アプリケーションに移り、db:migrate を実行すれば先ほどの重複エラーが発生せず先に進むことができます。

タイトルとURLをコピーしました