2017-10-16 4 views
3

Ich bin seit etwa 2 Jahren ein Benutzer von Django und es gibt eine Funktion, die ich immer befürchten musste: gefälschte Migrationen.Django migrate --fake und --fake-initial erklärt

Ich habe sah ziemlich überall und die meisten Informationen, die ich aus dem documentation bekommen kann, wo es heißt:

--fake

Django erzählt die Migrationen zu markieren haben angewendet oder nicht angewendet, aber ohne SQL ausgeführt, um Ihre Datenbankschema zu ändern.

Dies ist für fortgeschrittene Benutzer gedacht, um den aktuellen Migrationsstatus direkt zu bearbeiten, wenn sie Änderungen manuell anwenden; sein davor gewarnt, dass mit --fake das Risiko läuft die Migration Zustand Tabelle in einen Zustand setzen, wo eine manuelle Wiederherstellung benötigt werden Migrationen richtig laufen zu lassen.

--fake-initial

Ermöglicht Django eine App erste Migration, wenn alle Datenbank Tabellen mit den Namen aller Modelle von allen Create Operationen in dieser Migration existieren bereits erstellt zu überspringen. Diese Option ist für die Verwendung bei der ersten Ausführung von Migrationen für eine Datenbank vorgesehen, die die Verwendung von Migrationen vor der Verwendung von voraussetzt. Diese Option überprüft jedoch nicht für das übereinstimmende Datenbankschema über übereinstimmende Tabellennamen hinaus. Daher ist nur sicher zu verwenden, wenn Sie sicher sind, dass Ihr vorhandenes Schema dem entspricht, was in Ihrer anfänglichen Migration aufgezeichnet wurde.

Ich bekomme die allgemeine Idee und warum man diese Funktion nutzen möchte. Aber ich verstehe nicht den Teil, wo es heißt, dass dies nur für fortgeschrittene Benutzer gedacht ist.

Kann jemand erklären, was hinter der Szene passiert und warum manuelle Wiederherstellung benötigt wird.

HINWEIS

ich für die genaue rohen SQL-Abfragen nicht bin auf der Suche, die ausgeführt wird, wenn eine Migration vorgetäuscht. Ich bin nur auf der Suche nach einer allgemeinen Vorstellung von dem, was hinter der Szene passiert und vielleicht ein Beispiel dafür, warum das Vortäuschen einer Migration zu einem Zustand führen würde, in dem makemigrations nicht richtig funktionieren würde.

Antwort

3

Stellen Sie sich vor, Sie haben letzte Woche mit dem Ändern einer Anwendung begonnen, vielleicht weil Sie einen Fehler gefunden haben oder Sie ihn um ein Feld oder eine Spalte erweitert haben. Heute haben Sie ein Update erhalten, und Sie haben ein Problem, da bei einer Migration ein Feld hinzugefügt wird, das sich noch in Ihrer Datenbank befindet und Sie nur andere Teile dieser Migration anwenden können. Sie schauen auf seine SQL Inhalte, indem Sie

./manage sqlmigrate some_app 0007_new_migration >customized-some_app-0007_new_migration.sql 

den Inhalt mit der Änderung der letzten Woche vergleichen und zu entfernen oder einen Befehl auf Kommentar, die immer noch angewendet wird und nicht wiederholt werden kann. Führen Sie alle verbleibenden SQL manuell aus.Mark, dass die Migration wie wäre es automatisch angewendet:

./manage migrate --fake some_app 0007_new_migration 

Wenn Sie etwas, das niemand wahrscheinlich brechen kann Ihnen helfen, und weder Sie oder Migrationssystem kennt den aktuellen Zustand der Datenbank. Daher Backup, Notizen schreiben, eine Sandbox verwenden und genau arbeiten.

EDIT Die Migrationstabelle django_migrations ist eine einfache Liste der angewandten Migrationen in allen Anwendungen. Zeilen in dieser Tabelle sollten ständig mit der Datenbankstruktur synchronisiert sein. Migrationen können mit einer normalen Migration durchgeführt werden. (oder durch eine umgekehrte Migration in einen älteren Zustand aufgehoben werden, normalerweise mit einigen Datenverlusten) Eine falsche Migration wendet die Änderung nur auf die Tabelle django_migrations an.

me => select * from django_migrations; 
id | app  |   name   |   applied    
----+----------+-------------------------+------------------------------- 
    1 | some_app | 0001_initial   | 2017-10-16 06:11:07.31249+02 
    2 | some_app | 0002_auto_20171016_1905 | 2017-10-17 02:05:48.979295+02 

Eine Migration (Datei) ist eine Beschreibung der inkrementellen Änderung und Informationen Unterschiede bei den Modellen seit der letzten Migration möglich sein, zu bewerten, während makemigrations ausgeführt wird. Es ist auch in dem Fall ausreichend, in dem einige Tabellen zunächst nicht verwaltet wurden und später verwaltet werden konnten.

EDIT Ein Beispiel, wie sqlmigrate und --fake zu fix a broken database by migrations verwendet werden könnten (eine gelöschte Tabelle neu zu erstellen).

+0

Danke für die Antwort! Es hat mir geholfen, eine reale Situation für das Vortäuschen von Migrationen zu sehen, aber ich frage mich immer noch, was hinter der Szene passiert, während ich Migrationen vortäusche. – scharette

+0

@scharette Ja, nützliche Frage. Erklärt. – hynekcer