Es gibt bereits ähnliche Fragen für South, aber ich habe mein Projekt mit Django 1.7 gestartet und benutze South nicht.
Während der Entwicklung wurden viele Migrationen erstellt, die Software wurde jedoch noch nicht ausgeliefert und es gibt keine Datenbank, die migriert werden muss. Daher möchte ich die Migrationen zurücksetzen, als ob mein aktuelles Modell das ursprüngliche wäre, und alle Datenbanken neu erstellen.
Was ist der empfohlene Weg, um das zu tun?
EDIT: Ab Django 1.8 gibt es einen neuen Befehl namens squashmigrations, der das hier beschriebene Problem mehr oder weniger löst.
django
django-migrations
django-1.7
Kit Fisto
quelle
quelle
Antworten:
Ich schaff das. Ich habe das gerade herausgefunden und es ist gut.
Um die Migrationstabelle zu löschen:
app-name/migrations/
Ordner oder Inhalt entfernen .Machen Sie die Migrationen:
Räumen Sie Ihre Migrationen schließlich auf, ohne andere Datenbankänderungen vorzunehmen:
quelle
zero
. Für Django Migrationssystem<app-name>
ist jetzt eine neue App undmakemigrations <app-name>
startet ab0001
.--fake
verhindert, dass Tabellen tatsächlich geändert werden, sodass Migrationen nur als umgekehrt markiert und nicht tatsächlich auf das Schema angewendet werden sollten. (Der Vollständigkeit halber kleine Erklärungen hinzufügen, @ tani-rokk, @Fabrizio)manage.py migrate --fake <app-name> zero
Um die Migrationstabelle zu löschen, entfernen Sie dann <App-Name> / migrations / Ordner oder Inhalt. Dannmanage.py makemigrations <app-name>
und endlichmanage.py migrate --fake <app-name>
. Dadurch werden Ihre Migrationen aufgeräumt, ohne dass andere Datenbankänderungen vorgenommen werden müssen.In der Django 1.7-Version von Migrationen wurde die Reset-Funktionalität, die sich früher in South befand, zugunsten neuer Funktionen zum "Squashing" Ihrer Migrationen eingestellt. Dies soll ein guter Weg sein, um die Anzahl der Migrationen in Schach zu halten.
https://docs.djangoproject.com/de/dev/topics/migrations/#squashing-migrations
Wenn Sie immer noch wirklich von vorne anfangen möchten, können Sie die Migrationstabelle möglicherweise leeren und die Migrationen entfernen, nach denen Sie sie
makemigrations
erneut ausführen würden.quelle
raise KeyError("Migration %s dependencies reference nonexistent parent node %r" % (migration, parent))
./manage.py squashmigrations myapp 0004
werden alle Migrationen vor der Migration0004
in Ihrer Anwendung gequetschtmyapp
. Dadurch wird eine einzelne gequetschte Migration erstellt.Ich hatte gerade das gleiche Problem. Hier ist meine Problemumgehung.
Der
find
Befehl: http://unixhelp.ed.ac.uk/CGI/man-cgi?findquelle
Angenommen, dies ist Ihre Projektstruktur.
Sie können das Skript remove_migrations.py an der oben angegebenen Stelle ausführen, um alle Migrationsdateien zu löschen.
Das manuelle Löschen kann anstrengend sein, wenn Sie ein aufwendiges Projekt haben. Das hat mir viel Zeit gespart. Das Löschen von Migrationsdateien ist sicher. Ich habe dies ein x-tes Mal ohne Probleme getan ... bis jetzt.
Wenn ich jedoch den Migrationsordner gelöscht
makemigrations
odermigrate
den Ordner nicht für mich erstellt habe. Das Skript stellt sicher, dass der Migrationsordner mit seinen__init__.py
Speicherorten gespeichert bleibt, und löscht nur die Migrationsdateien.quelle
touch migrations/__init__.py
) neu erstellenDELETE FROM django_migrations Where app in ('app1', 'app2');
./manage.py makemigrations
./manage.py migrate --fake
ODER Sie können eine Migration von all dem schreiben
quelle
./manage.py makemigrations
, damit es funktioniert:./manage.py makemigrations orders alerts
Ich probiere verschiedene Befehle aus und einige der Antworten helfen mir. Nur diese Sequenz hat in meinem Fall sowohl fehlerhafte Abhängigkeiten bei Migrationen in MYAPP behoben als auch alle früheren Migrationen von Grund auf neu bereinigt.
Stellen Sie zuvor sicher, dass die Datenbank bereits synchronisiert ist (z. B. fügen Sie hier kein neues Modellfeld hinzu oder ändern Sie die Metaoptionen).
Dabei ist 0002 die Migrationsnummer, die vom letzten Befehl makemigrations zurückgegeben wurde.
Jetzt können Sie makemigrations / migrate wieder normal ausführen, da die Migration 0002 gespeichert ist, sich jedoch nicht in der bereits synchronisierten Datenbank widerspiegelt.
quelle
Wenn Sie sich nicht für frühere Migrationen interessieren, können Sie einfach alle Migrationen im Verzeichnis migrations / entfernen. Sie starten die Migrationssequenz von vorne und nehmen Ihr aktuelles Modell als Referenz, als hätten Sie jetzt das gesamte Modell geschrieben.
Wenn Sie mir nicht genug vertrauen, um sie zu entfernen, versuchen Sie stattdessen, sie zu entfernen.
quelle
Ein einfacher Weg ist
Gehen Sie zu jeder App und löschen Sie die Migrationsdateien.
Gehen Sie dann zur Tabelle django-migrtaions in der Datenbank und schneiden Sie sie ab (löschen Sie alle Einträge).
Danach können Sie erneut Migrationen erstellen.
quelle
CD in das src-Verzeichnis
cd /path/to/src
Migrationsverzeichnisse löschen
rm -rf your_app/migrations/
Beachten Sie, dass dies für jede App separat erfolgen sollte
Wandern
python3.3 manage.py migrate
wenn Sie erneut beginnen möchten
python3.3 manage.py makemigrations your_app
quelle
Wenn Sie sich im Entwicklungsmodus befinden und einfach alles zurücksetzen möchten (Datenbank, Migrationen usw.), verwende ich dieses Skript basierend auf der Antwort von Abdelhamid Ba. Dadurch werden die Tabellen der Datenbank (Postgres) gelöscht, alle Migrationsdateien gelöscht, die Migrationen erneut ausgeführt und meine ersten Geräte geladen:
reset-db.sql Datei:
Datei migration.sh:
Datei load_initial_fixtures.sh:
Stellen Sie einfach sicher, dass Sie die Pfade so ändern, dass sie Ihrer App entsprechen. Ich persönlich habe diese Skripte in einem Ordner namens project_root / script / local, und die Quellen von django befinden sich in project_root / src.
quelle
Nachdem ich jeden "Migrations" -Ordner in meiner App (manuell) gelöscht hatte, führte ich Folgendes aus:
Dann dachte ich, ich könnte einfach alles tun
./manage.py makemigrations
, um sie alle zu regenerieren. Es wurden jedoch keine Änderungen festgestellt. Ich habe dann versucht , eine App zu einem Zeitpunkt festgelegt wird :./manage.py makemigrations foo
,./manage.py makemigrations bar
. Dies führte jedoch zu zirkulären Abhängigkeiten, die nicht aufgelöst werden konnten.Schließlich habe ich einen einzelnen Makemigrations-Befehl ausgeführt, der ALLE meine Apps angegeben hat (in keiner bestimmten Reihenfolge):
Diesmal hat es funktioniert - zirkuläre Abhängigkeiten wurden automatisch aufgelöst (es wurden bei Bedarf zusätzliche Migrationsdateien erstellt).
Dann konnte ich rennen
./manage.py migrate --fake
und war wieder im Geschäft.quelle