web-dev-qa-db-ja.com

django.db.migrations.exceptions.InconsistentMigrationHistory

走るとき

python manage.py migrate

Djangoプロジェクトで、次のエラーが表示されます

Traceback (most recent call last):
File "manage.py", line 22, in <module>
execute_from_command_line(sys.argv)
File "/home/hari/project/env/local/lib/python2.7/site-     packages/Django/core/management/__init__.py", line 363, in execute_from_command_line
utility.execute()
File "/home/hari/project/env/local/lib/python2.7/site-packages/Django/core/management/__init__.py", line 355, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/hari/project/env/local/lib/python2.7/site-packages/Django/core/management/base.py", line 283, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/hari/project/env/local/lib/python2.7/site-packages/Django/core/management/base.py", line 330, in execute
output = self.handle(*args, **options)
File "/home/hari/project/env/local/lib/python2.7/site-packages/Django/core/management/commands/migrate.py", line 86, in handle
executor.loader.check_consistent_history(connection)
File "/home/hari/project/env/local/lib/python2.7/site-packages/Django/db/migrations/loader.py", line 298, in check_consistent_history
connection.alias,
Django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency account.0001_initial on database 'default'.

私は次のようなユーザーモデルを持っています

class User(AbstractUser):
place = models.CharField(max_length=64, null=True, blank=True)
address = models.CharField(max_length=128, null=True, blank=True)

どうすればこれを解決できますか?

37
Hari Krishnan

データベース内のDjango_migrationsテーブルは不整合の原因であり、ローカルパスからすべての移行を削除しても機能しません。

データベースからDjango_migrationsテーブルを切り捨ててから、移行を再度適用する必要があります。動作するはずですが、動作しない場合は、再度makemigrationsを実行してから移行します。

注:データのバックアップを取ることを忘れないでください。

22
Arpit Solanki

カスタムユーザーモデルを使用しているため、最初にコメントアウトできます

INSTALLED_APPS = [
...
#‘Django.contrib.admin’,
...
]

installed_Apps設定で。次に実行する

python manage.py migrate.

コメント解除したら

‘Django.contrib.admin’.
55
jackson

このページのほとんどの回答で問題に対処することから始めましょう。

あなたは決してhave Djangoの移行システムを正しく使用していて、shouldコミットされた移行を削除しない場合、データベースを削除します

現在、最適なソリューションは、Djangoの使用経験、移行システムの理解レベル、データベース内のデータの価値など、さまざまな要因に依存しています。

つまり、移行エラーに対処する方法は2つあります。

  1. nuclearオプションを使用します。Warning:これは、単独で作業している場合の唯一のオプションです。他の人が既存の移行に依存している場合、cannot削除するだけです。

    • すべての移行を削除し、python3 -m manage makemigrationsを使用して新しいセットを再構築します。これにより、移行の依存関係または不整合に関する問題がすべて解消されます。
    • データベース全体を削除します。これにより、実際のデータベーススキーマと、移行履歴に基づいて必要なスキーマとの間に矛盾があった場合に発生した問題が削除され、移行履歴と以前の移行ファイルに矛盾があった場合に発生した問題が削除されます。 InconsistentMigrationHistoryは苦情を言っています]。
    • python3 -m manage migrateを使用してデータベーススキーマを再作成します
  2. エラーの原因を特定し、解決します。(経験から言えば)原因はほとんど間違いなくばかげているyoやったからです。 (一般的に、移行システムを正しく使用する方法を理解していない結果として)。エラーの原因に基づいて、3つのカテゴリがあります。

    1. 移行ファイルとの矛盾。これは、プロジェクトで複数の人が作業しているときに非常に一般的なものです。うまくいけば、あなたの変更は競合せず、makemigrations --mergeがこれを解決できます。そうでなければ、誰かがこれを解決するために分岐点への移行をロールバックしなければなりません。
    2. スキーマと移行履歴の不一致。これを管理するには、誰かがデータベーススキーマを手動で編集するか、移行を削除します。移行を削除した場合、変更を元に戻して大声で叫びます。 never他の人が依存している場合は移行を削除する必要があります。データベーススキーマを手動で編集した場合は、変更を元に戻してから叫びます。 Djangoはデータベーススキーマを管理しており、他の誰も管理していません。
    3. 移行履歴と移行ファイルの不一致。 [これは、アスカーが被るInconsistentMigrationHistory問題であり、このページに到達したときに被った問題です]。これを管理するには、誰かが手動でDjango_migrationsテーブルを台無しにするか、移行を削除しましたafter適用されました。これを解決するには、矛盾の原因を解明し、手動で解決する必要があります。データベーススキーマが正しく、移行履歴だけが間違っている場合は、Django_migrationsテーブルを手動で編集してこれを解決できます。データベーススキーマが間違っている場合は、それを手動で編集して、本来あるべきものと一致させる必要があります。

問題の説明と選択した答えに基づいて、私はあなたが一人で働いており、Djangoを初めて使い、データを気にしないと仮定します。したがって、核オプションはあなたにとって正しいかもしれません。

あなたがこの状況になく、上記のテキストが意味不明なように見える場合、 Django User's Mailing List に助けを求めることをお勧めします。そこには、あなたがいる特定の混乱を解決するのを手伝ってくれる非常に親切な人々がいます。

信じてください、核に行くことなくこのエラーを解決できます!

28
Airs

ここでこれを適切に解決する方法。

プロジェクト内の移行フォルダーで次の手順を実行します。

  1. _pycache_および0001_initialファイルを削除します。
  2. ルートディレクトリからdb.sqlite3を削除します(すべてのデータが失われることに注意してください)。
  3. ターミナルで実行:
      python manage.py makemigrations
      python manage.py migrate

出来上がり。

13

問題

Django.db.migrations.exceptions.InconsistentMigrationHistory:移行admin.0001_initialは、データベース 'default'の依存関係account.0001_initialの前に適用されます。

したがって、まずadmin(admin.0001_initial)なしでデータベースを移行できます。

依存関係を移行した後、admin.0001_initialを移行するコマンドを実行します。

解決

  1. settings.pyのINSTALLED_APPSから「Django.contrib.admin」を削除します。
  2. コマンドを実行する:

Python manage.py makemigrations appname

Python manage.py migrate appname

  1. settings.pyファイルのINSTALLED_APPSに「Django.contrib.admin」を追加します。
  2. コマンドを再度実行します。

$:Python manage.py makemigrations appname

$:Python manage.py migrate appname

8
kun shi

空のデータベースで作業している場合、他のアプリの移行の前にaccountアプリの移行を簡単に修正できます。

$ ./manage.py migrate account

その後:

$ ./manage.py migrate
2
Duilio

新しいDjangoプロジェクトを作成して実行すると

python manage.py migrate

Djangoは、デフォルトで1つのauth_userテーブルと2つのauth_userを含む10個のテーブルを作成します。

abstractUserから継承するカスタムユーザーモデルを作成する場合、次のようなエラーメッセージでこの問題が発生します。

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

データベース全体を削除してこの問題を解決し、新しいデータベースを作成します。そして、これは私が言及した3つのテーブルを置き換えました。

2
hcf1425

アプリなしで新しいプロジェクトを作成すると、

python manage.py migrate

Djangoはデフォルトで10個のテーブルを作成します。

その後AbstractUserから継承する顧客ユーザーモデルを作成する場合、次のメッセージのようにこの問題が発生します。

Django.db.migrations.exceptions.InconsistentMigrationHistory:移行admin.0001_initialは、データベース 'default'の依存関係account.0001_initialの前に適用されます。

最後に、データベース全体を削除して実行します

1
hcf1425

Wagtail 2.0から2.4に移行するときにこれに遭遇しましたが、サードパーティのアプリが移行を押しつぶすときに何度か見ましたafter現在のバージョンで、移行する前のバージョン。

この場合の驚くほど簡単な解決策は、少なくとも次のとおりです。

./manage.py migrate
./manage.py makemigrations
./manage.py migrate

つまり、移行を試みる前に単一の移行を実行します。

1
Rick Westera

settings.pyAUTH_USER_MODE Lを次のように設定した場合:

AUTH_USER_MODEL = 'custom_user_app_name.User'

makemigrationおよびmigrateコマンドを実行する前にこの行をコメントする必要があります。その後、この行のコメントを再び解除できます。

1
Erfan Tahriri

これは、Djangoドキュメントの推奨事項に従って、カスタムユーザーモデルを追加した後、新しいプロジェクトで私に起こりました。

新しいプロジェクトを開始する場合、デフォルトのユーザーモデルで十分な場合でも、カスタムユーザーモデルを設定することを強くお勧めします。

ここに私が問題を解決するためにしたことを示します。

  1. データベースdb.sqlite3を削除します。
  2. App/migrationsフォルダーを削除します。

@jacksonごとに、Django.contrib.adminを一時的にコメントアウトします。

INSTALLED_APPS = [
...
#‘Django.contrib.admin’,
...
]

また、urls.pyの管理サイトをコメントアウトします。

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

パス( 'admin /')をコメントアウトしない場合、実行時にエラー「LookupError:No installed app with label 'admin'」が表示されます

python manage.py migrate

移行が完了したら、上記の両方のコメントを外します。

1
user9414732

sqliteファイルを削除するか、databse 'python manage.py flush'をフラッシュしてから、それぞれmakemigrationsおよびmigrateコマンドを実行してください。

1
Arun

この種の問題を引き起こす可能性があるユーザーエラー以外の別の理由があります。 Djangoの既知の問題 移行のスカッシュに関してです。

Python 2.7 + Django 1.1で完全に機能する一連の移行があります。 makemigrationsまたはmigrateを実行すると、データベースが新たに再作成された場合でも(テスト目的で)常に正常に機能します。

ただし、プロジェクトをPython 3.6(現在は同じDjango 1.11を使用)に移動すると、同じ移行が最初にしかうまく適用されない理由を突き止めようとしました。彼らは実行されます。その後、makemigrationsまたは単にmigrateを実行しようとすると、エラーが発生します。

Django.db.migrations.exceptions.InconsistentMigrationHistory

ここで、移行foo.0040-thingは、その依存関係foo.0038-something-squashed-0039-somethingelseの前に適用されます(たまたま移行が1つしかありません...残りははるかに簡単です)。

しばらく私を悩ませたのは、これがPython 3でのみ起こる理由です。DBが本当に矛盾している場合、これは常に起こるはずです。移行が最初に適用されたときに完全に正常に動作するように見えることは、同様に混乱を招きました。

多くの検索(現在のQ&Aスレッドを含む)の後、私はつまずきました 前述のDjangoバグレポート 。スカッシュ移行では、実際にb行でreplacesプレフィックスを使用しました(例:replaces = [(b'', 'foo.0038-defunct'),.......]

b行からreplacesプレフィックスを削除すると、すべて正常に機能しました。

0
MartyMacGyver

あなたのエラーは本質的には次のとおりです。

Migration "B" is applied before its dependency "A" on database 'default'.

Sanity Check:まず、データベースを開き、「Django_migrations」テーブルのレコードを確認します。レコードは時系列順にリストする必要があります(例:A、B、C、D ...)。

エラーにリストされている「A」マイグレーションの名前が、データベースにリストされている「A」マイグレーションの名前と一致していることを確認してください。 (以前に、手動で、編集、削除、または名前を変更した移行ファイルがある場合は、異なる場合があります)

これを修正するには、データベース内の移行A.の名前を変更するか、ファイル名を変更します。ただし、変更がチームの他の開発者がデータベースに持っているものと一致することを確認してください(または、変更が実稼働データベースのものと一致すること)

0
Michael Romrell

この問題は、ほとんどの場合、初期移行後にユーザーモデルを拡張すると発生します。 Abstractユーザーを拡張すると、email、first_nameなどのモデルに存在しない基本フィールドが作成されるためです。

これでもDjangoの抽象モデルに適用できます。

このための非常に簡単な解決策は、新しいデータベースを作成してから移行を適用するか、削除することです[この場合、すべてのデータが削除されます。]同じデータベースで、移行を再適用します。

0

標準ではなく独自のユーザーモデルを作成しようとしているときに、その例外が明らかになった場合は、それに従ってください instruction
次の手順に従って問題を解決できることがわかりました。

  1. Auth.Userと同じカスタムユーザーモデルを作成し、Userと呼び(多対多のテーブルは同じ名前を保持する)、db_table = 'auth_user'を設定する(同じテーブルを使用する)
  2. すべての移行を破棄する
  3. 移行の新しいセットを再作成します
  4. 鶏を生けifに捧げましょう。気になる人はおそらく2匹です。データベースのバックアップも作成します
  5. Django_migrationsテーブルを切り捨てます
  6. 新しい移行セットを偽装する
  7. Db_tableの設定を解除し、カスタムモデルに他の変更を加え、移行を生成し、それらを適用します

外部キー制約を強制するデータベースでこれを行うことを強くお勧めします。ラップトップのSQLiteでこれを試してはいけません。サーバーのPostgresで動作することを期待してください。

0
N.C.

最初にすべての移行ファイルとdb.sqlite3ファイルを削除し、次の手順に従います。

$ ./manage.py makemigrations myapp 
$ ./manage.py squashmigrations myapp 0001(may be differ)

古い移行ファイルを削除し、最後に。

$ ./manage.py migrate
0
shivam singhal