公開日: 最終更新日:

【django】django.db.utils.ProgrammingError: リレーション hogeはすでに存在しますの対処法

背景と問題点

djangoでmigrationがうまくいかず、以下のようなエラーで悩んでいた。

django.db.utils.ProgrammingError: 列app1_model1.hogehogeは存在しません

ググると結局migrationファイルを消せとしか出てこないのではーーーーーって気持ちで

$ python manage.py migrate --fake model1 zero
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc"  -delete

と、migrationsフォルダの__init__.py以外のファイル・フォルダをすべて抹消した。

それでmigrationファイルだけは消えたものの、データベース自体は残っているので初回makemigrationをすると当然だが全部テーブルを作り直そうとする。そのままmigrateすると

django.db.utils.ProgrammingError: リレーション hogeはすでに存在します

というエラーが出てくる。

解決法

公式ドキュメントに記述があった。

Changed in Django 1.8:

The --fake-initial flag was added to migrate; previously, initial migrations were always automatically fake-applied if existing tables were detected.

参考: https://docs.djangoproject.com/en/1.8/topics/migrations/#upgrading-from-south

あーーーーーーーーーーなるほど、ということで

$ python manage.py migrate --fake-initial

これで全部うまくmigrateできたようで、無事解決した。