Error:Djangoでマイグレート(migrate)ができない時の対処法「最終手段?」(docker-compose /PostgreSQL)

Error Message:

django.db.migrations.exceptions.InconsistentMigrationHistory: Migration account.0001_initial is applied before its dependency accounts.0001_initial on database 'default'.


Djangoで開発中、カスタムユーザーを作成したのちに、migrationファイルの作成、migrateを実行しようとした際にハマりました。

色々と検索をかけて、プロジェクトフォルダのsettings.pyファイルのInstallAppsコメントアウトをしたり、

migrationファイルのロールバックをかけたりしようとしましたが、そもそもmigrateができないから機能しない。。そんな事態。

原因としてはdjango-allauthをカスタムユーザー作成よりも前段でインストールしてmigrateしていたことにありそうだと考えていました。

検索記事の中に、「データベースをドロップする」と言う手段をとっているものがあり、一か八か、こちらを実行した際の顛末になります。


開発環境:
* Mac
* Django
* docker-compose
* PostgreSQL

% docker-compose run --rm web python3 manage.py makemigrations accounts
[+] Running 1/0
 ⠿ Container drinking-party-ms-db-1  Running                 0.0s
Traceback (most recent call last):
:
略)
:
raise InconsistentMigrationHistory(
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration account.0001_initial is applied before its dependency accounts.0001_initial on database 'default'.

既存のマイグレート情報が邪魔している模様 raise InconsistentMigrationHistory( django.db.migrations.exceptions.InconsistentMigrationHistory: Migration account.0001_initial is applied before its dependency accounts.0001_initial on database 'default'.

  • 過去のmigration履歴を以下のコマンドで確認
% docker-compose run --rm web python3 manage.py showmigrations 
[+] Running 1/0
 ⠿ Container drinking-party-ms-db-1  Run...                                    0.0s
account
 [X] 0001_initial
 [X] 0002_email_max_length
accounts
 [ ] 0001_initial
admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
 [X] 0003_logentry_add_action_flag_choices
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
 [X] 0009_alter_user_last_name_max_length
 [X] 0010_alter_group_name_max_length
 [X] 0011_update_proxy_permissions
 [X] 0012_alter_user_first_name_max_length
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial
sites
 [X] 0001_initial
 [X] 0002_alter_domain_unique
socialaccount
 [X] 0001_initial
 [X] 0002_token_max_lengths
 [X] 0003_extra_data_default_dict

accountっていうのは、Git管理対象にはないアプリだ。おそらく、DB内にある

account
 [X] 0001_initial
 [X] 0002_email_max_length
accounts
 [ ] 0001_initial
  • dockerのDBコンテナへに侵入
docker-compose exec db bash
psql -U postgres
root@d0db338505fe:/# psql -U postgres
psql (15.1 (Debian 15.1-1.pgdg110+1))
Type "help" for help.

postgres=# DROP SCHEMA public CASCADE;
NOTICE:  drop cascades to 17 other objects
DETAIL:  drop cascades to table django_migrations
drop cascades to table django_content_type
drop cascades to table auth_permission
drop cascades to table auth_group
drop cascades to table auth_group_permissions
drop cascades to table auth_user
drop cascades to table auth_user_groups
drop cascades to table auth_user_user_permissions
drop cascades to table account_emailaddress
drop cascades to table account_emailconfirmation
drop cascades to table django_admin_log
drop cascades to table django_session
drop cascades to table django_site
drop cascades to table socialaccount_socialaccount
drop cascades to table socialaccount_socialapp
drop cascades to table socialaccount_socialapp_sites
drop cascades to table socialaccount_socialtoken
DROP SCHEMA
postgres=# 
postgres=# CREATE SCHEMA public;
CREATE SCHEMA

綺麗になった

% docker-compose run --rm web python3 manage.py showmigrations              
[+] Running 1/0
 ⠿ Container drinking-party-ms-db-1  Running                    0.0s
account
 [ ] 0001_initial
 [ ] 0002_email_max_length
accounts
 (no migrations)
admin
 [ ] 0001_initial
 [ ] 0002_logentry_remove_auto_add
 [ ] 0003_logentry_add_action_flag_choices
auth
 [ ] 0001_initial
 [ ] 0002_alter_permission_name_max_length
 [ ] 0003_alter_user_email_max_length
 [ ] 0004_alter_user_username_opts
 [ ] 0005_alter_user_last_login_null
 [ ] 0006_require_contenttypes_0002
 [ ] 0007_alter_validators_add_error_messages
 [ ] 0008_alter_user_username_max_length
 [ ] 0009_alter_user_last_name_max_length
 [ ] 0010_alter_group_name_max_length
 [ ] 0011_update_proxy_permissions
 [ ] 0012_alter_user_first_name_max_length
contenttypes
 [ ] 0001_initial
 [ ] 0002_remove_content_type_name
party
 (no migrations)
sessions
 [ ] 0001_initial
sites
 [ ] 0001_initial
 [ ] 0002_alter_domain_unique
socialaccount
 [ ] 0001_initial
 [ ] 0002_token_max_lengths
 [ ] 0003_extra_data_default_dict

この後、マイグレーションとマイグレートを通常どおり実行することで、無事、データベースへの反映がなされました!

参考

Djangoのマイグレーションとデータベースのリセット方法 | Hodalog postgresql - Django Unit Tests - Unable to create the django_migrations table - Stack Overflow