wake-up-neo.com

django.db.migrations.exceptions.InconsistentMigrationHistory

Wenn ich renne 

python manage.py migrate

bei meinem Django-Projekt bekomme ich den folgenden Fehler

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'.

Ich habe ein Benutzermodell wie unten

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

Wie kann ich das lösen?

17
Hari Krishnan

Ihre Django_migrations-Tabelle in Ihrer Datenbank ist die Ursache für Inkonsistenzen. Das Löschen aller Migrationen aus dem lokalen Pfad funktioniert nicht.

Sie müssen die Django_migrations-Tabelle aus Ihrer Datenbank abschneiden und dann die Migrationen erneut anwenden. Es sollte funktionieren, aber wenn nicht, dann erneut Makemigrations ausführen und dann migrieren.

Hinweis: Vergessen Sie nicht, eine Sicherungskopie Ihrer Daten zu erstellen.

15
Arpit Solanki

Da Sie ein benutzerdefiniertes Benutzermodell verwenden, können Sie zunächst einen Kommentar abgeben 

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

in Ihren Installed_Apps-Einstellungen. Dann renne

python manage.py migrate.

Wenn unkommentiert gemacht 

‘Django.contrib.admin’.
37
jackson

Beginnen wir mit der Lösung des Problems mit den meisten Antworten auf dieser Seite:

Sie müssen niemals Ihre Datenbank löschen, wenn Sie das Migrationssystem von Django korrekt verwenden und Sie sollten lösche niemals Migrationen, sobald sie festgeschrieben sind

Nun hängt die beste Lösung für Sie von einer Reihe von Faktoren ab, wie erfahren Sie mit Django sind, wie gut Sie das Migrationssystem verstehen und wie wertvoll die Daten in Ihrer Datenbank sind.

Kurz gesagt, es gibt zwei Möglichkeiten, Migrationsfehler zu beheben.

  1. Nehmen Sie die Option nuclear . Warnung: Dies ist nur eine Option, wenn Sie alleine arbeiten. Wenn andere Personen von vorhandenen Migrationen abhängig sind, können Sie kann nicht sie einfach löschen.

    • Löschen Sie alle Migrationen und erstellen Sie mit python3 -m manage makemigrations Ein neues Set. Dies sollte alle Probleme beseitigen, die Sie mit Abhängigkeiten oder Inkonsistenzen bei Ihren Migrationen hatten.
    • Löschen Sie Ihre gesamte Datenbank. Dadurch werden alle Probleme mit Inkonsistenzen zwischen Ihrem tatsächlichen Datenbankschema und dem Schema, das Sie basierend auf Ihrem Migrationsverlauf haben sollten, beseitigt. Außerdem werden alle Probleme mit Inkonsistenzen zwischen Ihrem Migrationsverlauf und Ihren vorherigen Migrationsdateien beseitigt der InconsistentMigrationHistory beschwert sich über].
    • Erstellen Sie Ihr Datenbankschema mit python3 -m manage migrate
  2. Ermitteln Sie die Fehlerursache und beheben Sie sie, da (aus Erfahrung) die Ursache mit ziemlicher Sicherheit etwas Dummes ist, was Sie getan hat. (Im Allgemeinen, weil Sie nicht verstanden haben, wie Sie das Migrationssystem richtig verwenden). Basierend auf den Fehlern, die ich verursacht habe, gibt es drei Kategorien.

    1. Inkonsistenzen mit Migrationsdateien. Dies ist ziemlich häufig der Fall, wenn mehrere Personen an einem Projekt arbeiten. Hoffentlich widersprechen sich Ihre Änderungen nicht und makemigrations --merge Kann dieses Problem lösen, da andernfalls jemand seine Migrationen auf den Verzweigungspunkt zurücksetzen muss, um dieses Problem zu beheben.
    2. Inkonsistenzen zwischen Ihrem Schema und Ihrem Migrationsverlauf. Um dies zu verwalten, hat jemand entweder das Datenbankschema manuell bearbeitet oder Migrationen gelöscht. Wenn sie eine Migration gelöscht haben, machen Sie ihre Änderungen rückgängig und rufen sie an. Sie sollten nie Migrationen löschen, wenn andere von ihnen abhängig sind. Wenn sie das Datenbankschema manuell bearbeitet haben, setzen Sie die Änderungen zurück und rufen Sie sie dann an. Django verwaltet das Datenbankschema, sonst niemand.
    3. Inkonsistenzen zwischen Ihrem Migrationsverlauf und Ihren Migrationsdateien. [Dies ist das InconsistentMigrationHistory Problem, unter dem der Fragesteller leidet, und das, unter dem ich gelitten habe, als ich auf diese Seite gekommen bin]. Um dies zu verwalten, hat jemand entweder manuell mit der Tabelle Django_migrations Herumgespielt oder eine Migration gelöscht nach die angewendet wurde. Um dies zu beheben, müssen Sie herausfinden, wie die Inkonsistenz entstanden ist, und sie manuell beheben. Wenn Ihr Datenbankschema korrekt ist und nur der Migrationsverlauf falsch ist, können Sie die Tabelle Django_migrations Manuell bearbeiten, um dieses Problem zu beheben. Wenn Ihr Datenbankschema falsch ist, müssen Sie es auch manuell bearbeiten, um es mit dem zu vereinbaren, was es sein sollte.

Anhand Ihrer Problembeschreibung und der von Ihnen ausgewählten Antwort gehe ich davon aus, dass Sie alleine arbeiten, neu in Django sind und sich nicht um Ihre Daten kümmern. Die nukleare Option könnte also die richtige für Sie sein.

Wenn Sie nicht in dieser Situation sind und der obige Text wie Kauderwelsch aussieht, dann schlage ich vor, die Django User's Mailing List um Hilfe zu bitten. Es gibt dort sehr hilfreiche Leute, die Ihnen helfen können, das Problem zu lösen, in dem Sie sich gerade befinden.

Haben Sie Vertrauen, Sie können diesen Fehler beheben, ohne nuklear zu werden!

28
Airs

Hier, wie man das richtig löst.

Führen Sie die folgenden Schritte in Ihrem Migrationsordner im Projekt aus: 

  1. Löschen Sie die _pycache_- und die 0001_initial-Dateien. 
  2. Löschen Sie die Datei db.sqlite3 aus dem Stammverzeichnis (achten Sie darauf, dass alle Ihre Daten verloren gehen).
  3. auf dem Terminallauf: 
      python manage.py makemigrations
      python manage.py migrieren

Voila.

6

Wenn Sie an einer leeren Datenbank arbeiten, können Sie die Migrationen für die App account vor allen anderen App-Migrationen mit einer Schnellkorrektur ausführen.

$ ./manage.py migrate account

Und dann:

$ ./manage.py migrate
2
Duilio

Ich bin auf dieses Problem gestoßen, als ich von Wagtail 2.0 auf 2.4 migriert habe, habe es aber ein paar Mal gesehen, als eine Drittanbieter-App eine Migration unterdrückt nach Ihrer aktuellen Version, aber vor der Version, auf die Sie migrieren.

Die schockierend einfache Lösung ist in diesem Fall zumindest:

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

führen Sie eine einzelne Migration durch, bevor Sie versuchen, eine Migration durchzuführen.

1
Rick Westera

Problem

Django.db.migrations.exceptions.InconsistentMigrationHistory: Die Migration admin.0001_initial wird vor dem Abhängigkeitskonto.0001_initial der Datenbank "default" angewendet.

So können wir die Datenbank zunächst ohne admin (admin.0001_initial) migrieren.

Führen Sie nach der Migration der Abhängigkeit die Befehle aus, um admin.0001_initial zu migrieren.

Lösung

  1. entfernen Sie "Django.contrib.admin" aus INSTALLED_APPS in settings.py.
  2. befehle ausführen: 

Python manage.py Makemigrations-Anwendungsname

Python manage.py migriert den Anwendungsnamen

  1. fügen Sie 'Django.contrib.admin' zu INSTALLED_APPS in der Datei settings.py hinzu.
  2. befehle erneut ausführen: 

$: Python manage.py Makemigrations-Anwendungsname

$: Python manage.py migriert den Anwendungsnamen

1
kun shi

wenn Sie ein neues Django-Projekt erstellen und ausführen 

python manage.py migrieren 

Der Django erstellt standardmäßig 10 Tabellen, darunter eine Tabelle auth_user und zwei, die mit auth_user beginnen.

wenn Sie ein benutzerdefiniertes Benutzermodell erstellen möchten, das von AbstractUser erbt, wird dieses Problem mit der folgenden Fehlermeldung angezeigt:

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

Ich löse dieses Problem, indem ich meine gesamte Datenbank lösche und eine neue erstellt. Und dies ersetzte die drei Tabellen, die ich erwähnt habe.

1
hcf1425

Dies ist mir in einem neuen Projekt passiert, nachdem ich ein benutzerdefiniertes Benutzermodell gemäß der Empfehlung in den Django docs hinzugefügt habe.

Wenn Sie ein neues Projekt starten, wird dringend empfohlen, ein benutzerdefiniertes Benutzermodell einzurichten, auch wenn das Standardbenutzermodell für Sie ausreicht.

Hier ist, was ich getan habe, um das Problem zu lösen.

  1. Löschen Sie die Datenbank db.sqlite3.
  2. Löschen Sie den Ordner "app/migrations".

Kommentieren Sie Django.contrib.admin vorübergehend per @jackson aus.

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

Kommentieren Sie auch die Admin-Site in urls.py aus:

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

Wenn Sie den Pfad nicht auskommentieren ('admin /'), wird beim Ausführen die Fehlermeldung "LookupError: Keine installierte App mit der Bezeichnung 'admin'" angezeigt

python manage.py migrate

Entfernen Sie nach Abschluss der Migrationen beide Kommentare.

1
user9414732

löschen Sie einfach die sqlite-Datei, oder führen Sie die Datenbank 'python manage.py flush' aus. 

1
Arun

wenn Sie ein neues Projekt erstellen und keine Apps haben, führen Sie das aus 

python manage.py migrate

der Django erstellt standardmäßig 10 Tabellen.

Wenn Sie ein Kundenbenutzermodell erstellen möchten, das anschließend von AbstractUser erbt, wird dieses Problem wie folgt auftreten:

Django.db.migrations.exceptions.InconsistentMigrationHistory: Die Migration admin.0001_initial wird vor ihrer Abhängigkeit ausgeführt account.0001_initial für die Datenbank "default".

endlich Ich lasse meine gesamten Datenbanken fallen und starte 

0
hcf1425

Neben dem Benutzerfehler gibt es noch einen weiteren Grund, der zu solchen Problemen führen kann: ein bekanntes Problem mit Django wenn es um Squash-Migrationen geht.

Wir haben eine Reihe von Migrationen, die in Python 2.7 + Django 1.11 einwandfrei funktionieren. Das Ausführen von makemigrations oder migrate funktioniert immer so, wie es sollte usw., selbst wenn die Datenbank neu erstellt wird (zu Testzwecken).

Beim Verschieben eines Projekts nach Python 3.6 (derzeit wird das gleiche Django 1.11 verwendet) bin ich jedoch festgefahren, um herauszufinden, warum dieselben Migrationen nur beim ersten Mal in Ordnung sind sie laufen. Danach führt jeder Versuch, makemigrations oder nur migrate auszuführen, zu dem Fehler:

Django.db.migrations.exceptions.InconsistentMigrationHistory

wobei die Migration foo.0040-thing vor ihrer Abhängigkeit foo.0038-something-squashed-0039-somethingelse angewendet wird (wir haben zufällig nur diese eine gequetschte Migration ... der Rest ist viel einfacher).

Was mich eine Weile gestört hat, ist, warum dies nur auf Python passiert. 3. Wenn die Datenbank wirklich inkonsistent ist, sollte dies die ganze Zeit passieren. Dass die Migrationen bei der ersten Anwendung anscheinend einwandfrei funktionieren, war ebenso verwirrend.

Nach langem Suchen (einschließlich des aktuellen Q & A-Threads) bin ich auf den oben genannten Django Fehlerbericht gestoßen . Bei unserer Squash-Migration wurde in der Tat das Präfix b in der Zeile replaces verwendet (z. B. replaces = [(b'', 'foo.0038-defunct'),.......]

Nachdem ich die b -Präfixe aus der replaces -Zeile entfernt hatte, funktionierte alles normal.

0
MartyMacGyver

Ihr Fehler ist im Wesentlichen:

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

Sanity Check: Öffnen Sie zuerst Ihre Datenbank und sehen Sie sich die Datensätze in der Tabelle 'Django_migrations' an. Die Aufzeichnungen sollten in chronologischer Reihenfolge aufgeführt sein (z. B. A, B, C, D ...).

Stellen Sie sicher, dass der Name der im Fehler aufgeführten "A" -Migration mit dem Namen der in der Datenbank aufgeführten "A" -Migration übereinstimmt. (Sie können abweichen, wenn Sie zuvor Migrationsdateien manuell bearbeitet, gelöscht oder umbenannt haben.)

m dies zu beheben, benennen Sie Migration A entweder in der Datenbank um oder benennen Sie den Dateinamen um. ABER stellen Sie sicher, dass die Änderungen mit denen anderer Entwickler in Ihrem Team in ihren Datenbanken übereinstimmen (oder dass die Änderungen mit denen in Ihrer Produktionsdatenbank übereinstimmen).

0
Michael Romrell

Wenn Sie AUTH_USER_MODE L in settings.py so einstellen:

AUTH_USER_MODEL = 'custom_user_app_name.User'

sie sollten diese Zeile kommentieren, bevor Sie die Befehle makemigration und migrate ausführen. Dann können Sie diese Zeile wieder auskommentieren.

0
Erfan Tahriri

Dieses Problem tritt meistens auf, wenn Sie das Benutzermodell nach der ersten Migration erweitern. Denn wenn Sie den Abstract-Benutzer erweitern, werden grundlegende Felder erstellt, die im Modell vorhanden waren, wie E-Mail, Vorname usw.

Auch dies gilt für jedes abstrakte Modell in Django.

Eine sehr einfache Lösung hierfür ist, entweder eine neue Datenbank zu erstellen und dann Migrationen anzuwenden oder zu löschen. [In diesem Fall werden alle Daten gelöscht.] die gleiche Datenbank und wende Migrationen erneut an.

0

Wenn diese Ausnahme sich offenbart hat, während Sie versuchen, ein eigenes Benutzermodell anstelle des Standards zu erstellen, folgen Sie dieser Anweisung Anweisung
Ich habe meine Problemlösung gefunden, indem Sie diese Anweisungen Schritt für Schritt befolgen: 

  1. Erstellen Sie ein benutzerdefiniertes Benutzermodell, das mit auth.User identisch ist, nennen Sie es User (also Viele-zu-Viele-Tabellen haben denselben Namen), und legen Sie db_table = 'auth_user' .__ fest. (so benutzt es die gleiche Tabelle)
  2. Wirf alle deine Migrationen weg
  3. Erstellen Sie eine neue Gruppe von Migrationen
  4. Opfere ein Huhn, vielleicht zwei, wenn du besorgt bist; Machen Sie auch eine Sicherung Ihrer Datenbank
  5. Schneidet die Django_migrations-Tabelle ab
  6. Fake-Apply der neuen Gruppe von Migrationen
  7. Setzen Sie db_table nicht mehr, nehmen Sie andere Änderungen am benutzerdefinierten Modell vor, generieren Sie Migrationen und wenden Sie sie an 

Es wird dringend empfohlen, dies in einer Datenbank durchzuführen, die .__ erzwingt. Fremdschlüsseleinschränkungen. Versuchen Sie es nicht mit SQLite auf Ihrem Laptop und Erwarte, dass Postgres auf den Servern funktioniert!

0
N.C.

Löschen Sie zunächst alle Migrations- und db.sqlite3-Dateien und führen Sie die folgenden Schritte aus:

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

Löschen Sie die alte Migrationsdatei und abschließend.

$ ./manage.py migrate
0
shivam singhal