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
- accountsアプリに対して、マイグレーション実行
% 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
- PostgreSQL へ接続
psql -U postgres
- DBをDrop
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=#
- DBのスキーマを作成
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