【Django】ProgrammingError: relation “django_content_type” already existsの対処法

Djangoでmigrateをする時に、「ProgrammingError: relation “django_content_type” already exists」のエラーが出た際の対処法を説明します。

次のコマンドを実行します。

$ python manage.py migrate --fake-initial

migrateが通ったら問題クリアです。

【補足】

–fake-initialオプションは、過去のマイグレーションでCreateModelによって全DBテーブルが作成されていた場合、initialマイグレーションをDjangoにスキップさせるというオプションです。Django1.8から追加されたオプションになります。

The –fake-initial option can be used to allow Django to skip an app’s initial migration if all database tables with the names of all models created by all CreateModel operations in that migration already exist.

詳しくはドキュメントを参照してください。

このコマンドでもmigrateが通らず、次のようなエラーが出た場合は

column "name" of relation "django_content_type" does not exist

手動でdjango_content_typeテーブルにnameカラムを追加すると解決できます。

コンソールから追加する場合は、データベースに入り、以下のコマンドを実行します。

$ ALTER TABLE django_content_type ADD COLUMN name character varying(50) 
NOT NULL DEFAULT 'someName';

DBeaverなどのクライアントツールから追加しても良いでしょう。

補足

上記で –fake-initialオプションについて紹介しましたが、Djangoのマイグレーションには他にもオプションがあるので、いくつかご紹介します。

  • zeroオプション

initialマイグレーションも含め、完全に初期化したい時に使います。

$ python manage.py migrate zero
  • fakeオプション

全てのマイグレーションを実行しないほか、データベースのスキーマへの変更も行いません。ただ、django_migrationsテーブルへの書き込みは行われます。

Fakeオプションを使用する想定場面としては、何らかの事情で直接データベースに変更を加えた時に、fakeオプションを使ってマイグレーションが無事行われたようにすることができます。

$ python manage.py migrate --fake
  • emptyオプション

空のマイグレーションファイルを作成するコマンドです。

$ python manage.py makemigrations --empty


Startlabのプログラミング入門コースは、Python未経験者・初学者にもわかりやすいカリキュラムと続けやすいサポート体制が魅力。自分の学習目的に合っているか、どういった知識を身に付けることができるのかなど、無料カウンセリングでぜひご相談ください!カウンセリングは毎日実施中、お待ちしております!

無料カウンセリングを予約する