LoginSignup
11
4

More than 3 years have passed since last update.

django.db.migrations.exceptions.InconsistentMigrationHistory エラー対処

Last updated at Posted at 2020-10-05

はじめに

DjangoでWeb開発をしていたとき、Migrationエラーに結構時間がかかったので、自分が対処した経緯を残す。

環境

Mac Catalina 10.15.6
Python 3.7
PostgreSQL 10.14
Django 2.2.2

Migration

makemigrations

$ python manage.py makemigrations
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency user.0001_initial on database 'default'

エラーは、CustomUserモデルを適用する前に一度でも python manage.py makemigrations した場合に起きるらしい . . .

migrate

$ python manage.py migrate
RuntimeError: Model class django.contrib.sites.models.Site doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.

もちろん、migrateの方もダメでした。

現状のMigrations状況を確認

$ python manage.py showmigrations

これでエラーが出ると、そもそもMigrateできていないということ。

対処

対処1

まずは、それぞれのアプリのmigrations直下の__init__.py以外のファイルを全て削除する。  

次にsettings.pyにあるINSTALLED_APPS一番上の'django.contrib.admin'部分をコメントアウト。

#***** settings.py ********

$ INSTALLED_APPS = [
    # 'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'accounts'
]

AUTH_USER_MODEL = 'accounts.CustomUser'

さらに、urls.pyurlpatternsのadmin部分をコメントアウト。

#*****  urls.py  *******

from django.contrib import admin
from django.urls import path
from django.urls.conf import include

urlpatterns = [
   # path('admin/', admin.site.urls),
]

これで一旦migrateを行ってみよう。うまくいけば通る。

対処2

対処1と同じように、それぞれのアプリのmigrations直下の__init__.py以外のファイルを全て削除する。  

データベースごと削除して作り直す

実際、自分は対処1ではエラーは直せなかったので、この方法で、データベースを再構築することでmakemigrationsmigrateに成功した。
ここではpostgresql@10を使用している。

データベースについてはこちら

データベースを確認

$ psql -l

                             List of databases
Name      |  Owner  | Encoding |   Collate   |    Ctype    |  Access 
                                                           |  privileges  
---------------+---------+----------+-------------+-------------+---------
postgres   | kanzaki | UTF8   | en_US.UTF-8 | en_US.UTF-8 | 
app_name   | kanzaki | UTF8   | en_US.UTF-8 | en_US.UTF-8 | 
template0  | kanzaki | UTF8   | en_US.UTF-8 | en_US.UTF-8 | =c/kanzaki  +
           |         |        |             |             | kanzaki=CTc/ 
           |         |        |             |             | kanzaki
template1  | kanzaki | UTF8   | en_US.UTF-8 | en_US.UTF-8 | =c/kanzaki  +
           |         |        |             |             | kanzaki=CTc/ 
           |         |        |             |             | kanzaki
(4 rows)

デーベースを削除する

$ dropdb app_name 

データベースが削除されていることを確認

$ psql -l

                             List of databases
Name      |  Owner  | Encoding |   Collate   |    Ctype    |  Access 
                                                           |  privileges  
---------------+---------+----------+-------------+-------------+---------
postgres   | kanzaki | UTF8   | en_US.UTF-8 | en_US.UTF-8 | 
template0  | kanzaki | UTF8   | en_US.UTF-8 | en_US.UTF-8 | =c/kanzaki  +
           |         |        |             |             | kanzaki=CTc/ 
           |         |        |             |             | kanzaki
template1  | kanzaki | UTF8   | en_US.UTF-8 | en_US.UTF-8 | =c/kanzaki  +
           |         |        |             |             | kanzaki=CTc/ 
           |         |        |             |             | kanzaki
(3 rows)

データベースを再構築

$ brew services start postgresql@10
$ create app_name

makemigrations & migrate

$ python manage.py migrate
Operations to perform:
  Apply all migrations: account, accounts, admin, auth, contenttypes, diary, 
sessions, sites
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0001_initial... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying accounts.0001_initial... OK
  Applying account.0001_initial... OK
  Applying account.0002_email_max_length... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying diary.0001_initial... OK
  Applying sessions.0001_initial... OK
  Applying sites.0001_initial... OK
  Applying sites.0002_alter_domain_unique... OK

無事にできましたか?

まとめ

今回は、DjangoでWeb開発している際にかなりハマった一部分を記事にまとめました。
DBを再構築することでMigrationできましたが、この方法を示した記事はあまりなかったので書きました。
こんな方法でも解決できることを知らせたかったです。

参考

Django は必ず CustomUserモデルを使え!という話
Django カスタムユーザーのマイグレーションに失敗するときの対処法

11
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
4