Ich versuche mit South anzufangen. Ich hatte eine vorhandene Datenbank und fügte South ( syncdb
, schemamigration --initial
) hinzu.
Dann habe ich aktualisiert models.py
, um ein Feld hinzuzufügen, und bin gelaufen ./manage.py schemamigration myapp --auto
. Es schien das Feld zu finden und sagte, ich könnte dies anwenden ./manage.py migrate myapp
. Aber das gab den Fehler:
django.db.utils.DatabaseError: table "myapp_tablename" already exists
tablename
ist die erste Tabelle in models.py
.
Ich verwende Django 1.2, South 0.7
django
django-south
Steve
quelle
quelle
schemamigration
vor dem wiederholen müssen,migrate
falls wir bereits vor dem letzten Änderungen vorgenommen habenschemamigration
.Habe genau das gleiche Problem!
1. Überprüfen Sie zunächst die Migrationsnummer, die dies verursacht. Nehmen wir an, es ist: 0010.
2.Sie müssen:
Wenn mehr als ein Feld fehlt, müssen Sie es für jedes Feld wiederholen.
3. Jetzt landen Sie mit einer Reihe neuer Migrationen. Entfernen Sie deren Dateien aus myapp / migrations (0011 und weiter, wenn Sie mehrere Felder hinzufügen müssen).
4. Führen Sie dies aus:
Versuchen Sie nun, ./manage.py myapp zu migrieren
Wenn es nicht fehlschlägt, sind Sie bereit. Überprüfen Sie einfach, ob Felder fehlen.
BEARBEITEN:
Dieses Problem kann auch auftreten, wenn Sie über eine Produktionsdatenbank verfügen, für die Sie South installieren, und die erste anfängliche Migration, die in einer anderen Umgebung erstellt wurde, das dupliziert, was Sie bereits in Ihrer Datenbank haben. Die Lösung ist hier viel einfacher:
Fake die erste Migration:
./manage migrate myapp 0001 --fake
Rollen Sie mit dem Rest der Migrationen:
./manage migriere myapp
quelle
Als ich auf diesen Fehler stieß, hatte er eine andere Ursache.
In meinem Fall hatte South irgendwie in meiner DB eine temporäre leere Tabelle hinterlassen , die in _remake_table () verwendet wird . Wahrscheinlich hatte ich eine Migration auf eine Weise abgebrochen, die ich nicht hätte haben sollen. In jedem Fall wird jede nachfolgende neue Migration, wenn es _remake_table () aufgerufen wurde den Fehler zu werfen
sqlite3.pypysqlite2.dbapi2.OperationalError: table "_south_new_myapp_mymodel" already exists
, denn es ist bereits vorhanden und wurde nicht dort sein soll.Das südliche neue Stück sah für mich seltsam aus, also durchsuchte ich meine Datenbank, sah den Tisch
_south_new_myapp_mymodel
, kratzte mir am Kopf, schaute auf Souths Quelle , entschied, dass es Müll war, ließ den Tisch fallen und alles war gut.quelle
Wenn Sie Probleme mit Ihren Modellen haben, die nicht mit Ihrer Datenbank übereinstimmen, wie z. B. @pielgrzym, und Sie die Datenbank automatisch so migrieren möchten, dass sie mit der neuesten Datei models.py übereinstimmt (und alle Daten löschen, die während des Spiels nicht von den Fixtures neu erstellt werden
migrate
):Dadurch werden nur Datenbanktabellen gelöscht und neu erstellt, die in Ihrer neuesten
models.py
Datei vorhanden sind. Daher haben Sie möglicherweise Garbage-Tabellen aus früherensyncdb
s odermigrate
s in Ihrer Datenbank . Um diese zu beseitigen, gehen Sie all diesen Migrationen voraus:Und wenn dadurch immer noch CRUFT in Ihrer Datenbank herumliegen, müssen Sie eine
inspectdb
erstellen und diemodels.py
Datei daraus erstellen (für die Tabellen und Apps, die Sie löschen möchten), bevorsqlclear
Sie das ausführen und dann Ihre ursprüngliche models.py wiederherstellen Erstellen der--initial
Migration und Migration darauf. All dies, um nicht mit der besonderen SQL-Variante herumzuspielen, die Ihre Datenbank benötigt.quelle
Perform these steps in order may help you
::1) python manage.py schemamigration apps.appname --initial
Der obige Schritt erstellt standardmäßig einen Migrationsordner.
2) python manage.py migrate apps.appname --fake
erzeugt eine gefälschte Migration.
3) python manage.py schemamigration apps.appname --auto
Anschließend können Sie nach Belieben Felder hinzufügen und den obigen Befehl ausführen.
4) python manage.py migrate apps.appname
quelle
Wenn Sie über eine vorhandene Datenbank und App verfügen, können Sie den Befehl zur Konvertierung nach Süden verwenden
Dies muss angewendet werden, bevor Sie Änderungen an dem vornehmen, was sich bereits in der Datenbank befindet.
Der Befehl convert_to_south funktioniert nur auf dem ersten Computer, auf dem Sie ihn ausführen. Sobald Sie die ersten Migrationen in Ihr VCS festgeschrieben haben, müssen Sie sie
./manage.py migrate myapp 0001 --fake
auf jedem Computer ausführen, auf dem eine Kopie der Codebasis vorhanden ist (stellen Sie zunächst sicher, dass diese mit den Modellen und dem Schema auf dem neuesten Stand sind). ref: http://south.readthedocs.org/en/latest/convertinganapp.htmlquelle
Als temporäre Lösung können Sie die Tabellenerstellung im Migrationsskript kommentieren.
Oder
Wenn die vorhandene Tabelle keine Zeilen enthält (leer), sollten Sie die Tabelle wie folgt löschen. (Dieser Fix wird nur empfohlen, wenn die Tabelle keine Zeilen enthält .) Stellen Sie diese Operation auch vor der Operation createModel sicher.
quelle
Eine weitere Lösung (möglicherweise eine vorübergehende Lösung).
z.B.,.
Dadurch werden alle Migrationen in unformatierten SQL-Abfragen aufgelistet. Sie können die Abfragen auswählen, die Sie ausführen möchten, und dabei den Teil vermeiden, der die vorhandene Tabelle erstellt
quelle