走るとき
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)
どうすればこれを解決できますか?
データベース内のDjango_migrationsテーブルは不整合の原因であり、ローカルパスからすべての移行を削除しても機能しません。
データベースからDjango_migrationsテーブルを切り捨ててから、移行を再度適用する必要があります。動作するはずですが、動作しない場合は、再度makemigrationsを実行してから移行します。
注:データのバックアップを取ることを忘れないでください。
カスタムユーザーモデルを使用しているため、最初にコメントアウトできます
INSTALLED_APPS = [
...
#‘Django.contrib.admin’,
...
]
installed_Apps設定で。次に実行する
python manage.py migrate.
コメント解除したら
‘Django.contrib.admin’.
このページのほとんどの回答で問題に対処することから始めましょう。
あなたは決してhave Djangoの移行システムを正しく使用していて、shouldコミットされた移行を削除しない場合、データベースを削除します
現在、最適なソリューションは、Djangoの使用経験、移行システムの理解レベル、データベース内のデータの価値など、さまざまな要因に依存しています。
つまり、移行エラーに対処する方法は2つあります。
nuclearオプションを使用します。Warning:これは、単独で作業している場合の唯一のオプションです。他の人が既存の移行に依存している場合、cannot削除するだけです。
python3 -m manage makemigrations
を使用して新しいセットを再構築します。これにより、移行の依存関係または不整合に関する問題がすべて解消されます。InconsistentMigrationHistory
は苦情を言っています]。python3 -m manage migrate
を使用してデータベーススキーマを再作成しますエラーの原因を特定し、解決します。(経験から言えば)原因はほとんど間違いなくばかげているyoやったからです。 (一般的に、移行システムを正しく使用する方法を理解していない結果として)。エラーの原因に基づいて、3つのカテゴリがあります。
makemigrations --merge
がこれを解決できます。そうでなければ、誰かがこれを解決するために分岐点への移行をロールバックしなければなりません。InconsistentMigrationHistory
問題であり、このページに到達したときに被った問題です]。これを管理するには、誰かが手動でDjango_migrations
テーブルを台無しにするか、移行を削除しましたafter適用されました。これを解決するには、矛盾の原因を解明し、手動で解決する必要があります。データベーススキーマが正しく、移行履歴だけが間違っている場合は、Django_migrations
テーブルを手動で編集してこれを解決できます。データベーススキーマが間違っている場合は、それを手動で編集して、本来あるべきものと一致させる必要があります。問題の説明と選択した答えに基づいて、私はあなたが一人で働いており、Djangoを初めて使い、データを気にしないと仮定します。したがって、核オプションはあなたにとって正しいかもしれません。
あなたがこの状況になく、上記のテキストが意味不明なように見える場合、 Django User's Mailing List に助けを求めることをお勧めします。そこには、あなたがいる特定の混乱を解決するのを手伝ってくれる非常に親切な人々がいます。
信じてください、核に行くことなくこのエラーを解決できます!
ここでこれを適切に解決する方法。
プロジェクト内の移行フォルダーで次の手順を実行します。
出来上がり。
Django.db.migrations.exceptions.InconsistentMigrationHistory:移行admin.0001_initialは、データベース 'default'の依存関係account.0001_initialの前に適用されます。
したがって、まずadmin(admin.0001_initial)なしでデータベースを移行できます。
依存関係を移行した後、admin.0001_initial
を移行するコマンドを実行します。
Python manage.py makemigrations appname
Python manage.py migrate appname
$:Python manage.py makemigrations appname
$:Python manage.py migrate appname
空のデータベースで作業している場合、他のアプリの移行の前にaccountアプリの移行を簡単に修正できます。
$ ./manage.py migrate account
その後:
$ ./manage.py migrate
新しい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つのテーブルを置き換えました。
アプリなしで新しいプロジェクトを作成すると、
python manage.py migrate
Djangoはデフォルトで10個のテーブルを作成します。
その後AbstractUser
から継承する顧客ユーザーモデルを作成する場合、次のメッセージのようにこの問題が発生します。
Django.db.migrations.exceptions.InconsistentMigrationHistory:移行admin.0001_initialは、データベース 'default'の依存関係account.0001_initialの前に適用されます。
最後に、データベース全体を削除して実行します
Wagtail 2.0から2.4に移行するときにこれに遭遇しましたが、サードパーティのアプリが移行を押しつぶすときに何度か見ましたafter現在のバージョンで、移行する前のバージョン。
この場合の驚くほど簡単な解決策は、少なくとも次のとおりです。
./manage.py migrate
./manage.py makemigrations
./manage.py migrate
つまり、移行を試みる前に単一の移行を実行します。
settings.pyでAUTH_USER_MODE Lを次のように設定した場合:
AUTH_USER_MODEL = 'custom_user_app_name.User'
makemigrationおよびmigrateコマンドを実行する前にこの行をコメントする必要があります。その後、この行のコメントを再び解除できます。
これは、Djangoドキュメントの推奨事項に従って、カスタムユーザーモデルを追加した後、新しいプロジェクトで私に起こりました。
新しいプロジェクトを開始する場合、デフォルトのユーザーモデルで十分な場合でも、カスタムユーザーモデルを設定することを強くお勧めします。
ここに私が問題を解決するためにしたことを示します。
@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
移行が完了したら、上記の両方のコメントを外します。
sqliteファイルを削除するか、databse 'python manage.py flush'をフラッシュしてから、それぞれmakemigrationsおよびmigrateコマンドを実行してください。
この種の問題を引き起こす可能性があるユーザーエラー以外の別の理由があります。 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
プレフィックスを削除すると、すべて正常に機能しました。
あなたのエラーは本質的には次のとおりです。
Migration "B" is applied before its dependency "A" on database 'default'.
Sanity Check:まず、データベースを開き、「Django_migrations」テーブルのレコードを確認します。レコードは時系列順にリストする必要があります(例:A、B、C、D ...)。
エラーにリストされている「A」マイグレーションの名前が、データベースにリストされている「A」マイグレーションの名前と一致していることを確認してください。 (以前に、手動で、編集、削除、または名前を変更した移行ファイルがある場合は、異なる場合があります)
これを修正するには、データベース内の移行A.の名前を変更するか、ファイル名を変更します。ただし、変更がチームの他の開発者がデータベースに持っているものと一致することを確認してください(または、変更が実稼働データベースのものと一致すること)
この問題は、ほとんどの場合、初期移行後にユーザーモデルを拡張すると発生します。 Abstractユーザーを拡張すると、email、first_nameなどのモデルに存在しない基本フィールドが作成されるためです。
これでもDjangoの抽象モデルに適用できます。
このための非常に簡単な解決策は、新しいデータベースを作成してから移行を適用するか、削除することです[この場合、すべてのデータが削除されます。]同じデータベースで、移行を再適用します。
標準ではなく独自のユーザーモデルを作成しようとしているときに、その例外が明らかになった場合は、それに従ってください instruction
次の手順に従って問題を解決できることがわかりました。
- Auth.Userと同じカスタムユーザーモデルを作成し、Userと呼び(多対多のテーブルは同じ名前を保持する)、db_table = 'auth_user'を設定する(同じテーブルを使用する)
- すべての移行を破棄する
- 移行の新しいセットを再作成します
- 鶏を生けifに捧げましょう。気になる人はおそらく2匹です。データベースのバックアップも作成します
- Django_migrationsテーブルを切り捨てます
- 新しい移行セットを偽装する
- Db_tableの設定を解除し、カスタムモデルに他の変更を加え、移行を生成し、それらを適用します
外部キー制約を強制するデータベースでこれを行うことを強くお勧めします。ラップトップのSQLiteでこれを試してはいけません。サーバーのPostgresで動作することを期待してください。
最初にすべての移行ファイルとdb.sqlite3ファイルを削除し、次の手順に従います。
$ ./manage.py makemigrations myapp
$ ./manage.py squashmigrations myapp 0001(may be differ)
古い移行ファイルを削除し、最後に。
$ ./manage.py migrate