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?
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.
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’.
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.
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.
python3 -m manage makemigrations
Ein neues Set. Dies sollte alle Probleme beseitigen, die Sie mit Abhängigkeiten oder Inkonsistenzen bei Ihren Migrationen hatten.InconsistentMigrationHistory
beschwert sich über].python3 -m manage migrate
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.
makemigrations --merge
Kann dieses Problem lösen, da andernfalls jemand seine Migrationen auf den Verzweigungspunkt zurücksetzen muss, um dieses Problem zu beheben.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!
Hier, wie man das richtig löst.
Führen Sie die folgenden Schritte in Ihrem Migrationsordner im Projekt aus:
Voila.
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
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.
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.
Python manage.py Makemigrations-Anwendungsname
Python manage.py migriert den Anwendungsnamen
$: Python manage.py Makemigrations-Anwendungsname
$: Python manage.py migriert den Anwendungsnamen
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.
Dies ist mir in einem neuen Projekt passiert, nachdem ich ein benutzerdefiniertes Benutzermodell gemäß der Empfehlung in den Django docs hinzugefügt habe.
Hier ist, was ich getan habe, um das Problem zu lösen.
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.
löschen Sie einfach die sqlite-Datei, oder führen Sie die Datenbank 'python manage.py flush' aus.
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
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.
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).
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.
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.
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:
- 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)
- Wirf alle deine Migrationen weg
- Erstellen Sie eine neue Gruppe von Migrationen
- Opfere ein Huhn, vielleicht zwei, wenn du besorgt bist; Machen Sie auch eine Sicherung Ihrer Datenbank
- Schneidet die Django_migrations-Tabelle ab
- Fake-Apply der neuen Gruppe von Migrationen
- 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!
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