Warum funktionieren meine Südmigrationen nicht?

78

Zuerst erstelle ich meine Datenbank.

create database mydb;

Ich füge "Süd" zu installierten Apps hinzu. Dann gehe ich zu diesem Tutorial: http://south.aeracode.org/docs/tutorial/part1.html

Das Tutorial fordert mich dazu auf:

$ py manage.py  schemamigration wall --initial
>>> Created 0001_initial.py. You can now apply this migration with: ./manage.py migrate wall

Großartig, jetzt migriere ich.

$ py manage.py migrate wall

Aber es gibt mir diesen Fehler ...

django.db.utils.DatabaseError: (1146, "Table 'fable.south_migrationhistory' doesn't exist")

Ich verwende also Google (was nie funktioniert. Daher meine 870 Fragen zu Stackoverflow) und erhalte die folgende Seite: http://groups.google.com/group/south-users/browse_thread/thread/d4c83f821dd2ca1c

Okay, also folge ich diesen Anweisungen

>> Drop database mydb;
>> Create database mydb;
$ rm -rf ./wall/migrations
$ py manage.py syncdb

Aber wenn ich syncdb ausführe, erstellt Django eine Reihe von Tabellen. Ja, es wird die Tabelle "south_migrationhistory" erstellt, aber es werden auch die Tabellen meiner App erstellt.

Synced:
 > django.contrib.admin
 > django.contrib.auth
 > django.contrib.contenttypes
 > django.contrib.sessions
 > django.contrib.sites
 > django.contrib.messages
 > south
 > fable.notification
 > pagination
 > timezones
 > fable.wall
 > mediasync
 > staticfiles
 > debug_toolbar

Not synced (use migrations):
 - 
(use ./manage.py migrate to migrate these)

Cool .... jetzt sagt es mir, diese zu migrieren. Also mache ich das:

$ py manage.py  migrate wall
The app 'wall' does not appear to use migrations.

Okay, so gut. Ich werde den ersten Migrationen eine Wand hinzufügen.

$ py manage.py schemamigration wall --initial

Dann migriere ich:

$ py manage.py migrate wall

Weißt du was? Es gibt mir diese BS:

_mysql_exceptions.OperationalError: (1050, "Table 'wall_content' already exists")

Entschuldigung, das macht mich wirklich wütend. Kann jemand helfen? Vielen Dank.

Wie bringe ich South dazu, zu arbeiten und mit allem richtig zu synchronisieren? Ich kann mir nur vorstellen, meine App aus INSTALLED_APPS zu entfernen, dann syncdb auszuführen und wieder hinzuzufügen.

Das ist so albern.

TIMEX
quelle
6
Kens Antwort ist in Bezug auf Lösungen grundsätzlich richtig, aber nur um darauf hinzuweisen, was schief gelaufen ist, damit Sie daraus lernen können: Das Löschen Ihres Migrationsverzeichnisses war das Problem beim zweiten Mal. Ausgehend von einer sauberen Datenbank: 1. Erstellen Sie Ihre Migrationen für die Apps, die sie verwenden, 2. Führen Sie syncdb aus, 3. Führen Sie den Befehl migrate aus. Dabei wird syncdb verwendet, um nicht migrierte Tabellen zu erstellen, und südlich, um migrierte Tabellen zu erstellen. Ein letzter Punkt: Wenn in der Syncdb-Ausgabe "Nicht synchronisiert (Migrationen verwenden)" angezeigt wird, lesen Sie unbedingt, was danach tatsächlich kommt. In Ihrer Ausgabe war nichts zu migrieren, da Sie keine Migrationen hatten.
Gabriel Hurley
2
+1 für eine gründliche Analyse Ihres Problems
Filip Dupanović
Wenn Sie mit Klassen in mehreren Dateien arbeiten, prüfen Sie, ob Sie in allen Dateien app_label haben!
Andilabs

Antworten:

175

Mit South können Sie Migrationen erstellen, wenn Sie zum ersten Mal mit einer neuen App beginnen und die Tabellen noch nicht zur Datenbank hinzugefügt wurden. Außerdem können Sie Migrationen für ältere Apps erstellen, die bereits Tabellen in der Datenbank enthalten. Der Schlüssel ist zu wissen, wann was zu tun ist.

Ihr erster Fehler war, als Sie Ihre Migrationen löschten, sobald Sie dies taten und dann syncdb ausführten. Django wusste nicht, dass Sie wollten, dass South diese App mehr verwaltet, und erstellte die Tabellen für Sie. Als Sie Ihre ersten Migrationen erstellt und dann migrate ausgeführt haben, hat South versucht, Tabellen zu erstellen, die Django bereits erstellt hat, und damit Ihren Fehler.

Zu diesem Zeitpunkt haben Sie zwei Möglichkeiten.

  1. Löschen Sie die Tabellen für die Wall-App aus Ihrer Datenbank und führen Sie sie aus. $ py manage.py migrate wallDadurch wird die Migration ausgeführt und Ihre Tabellen erstellt.

  2. Fake out the initial migration run $ py manage.py migrate wall 0001 --fakeDies zeigt South an, dass Sie die Tabellen bereits in der Datenbank haben. Fälschen Sie sie also einfach, wodurch der Tabelle south_migrationhistory eine Zeile hinzugefügt wird, damit Sie bei der nächsten Migration wissen, dass die erste Migration erfolgt wurde bereits ausgeführt.

Ein neues Projekt und keine Datenbank einrichten

  1. Erstellen Sie Ihre Datenbank
  2. Hinzufügen von Süden zu installierten Apps
  3. Wenn Sie syncdb ausführen, werden die Tabellen django und south zur Datenbank hinzugefügt
  4. Fügen Sie Ihre Apps hinzu
  5. Dadurch werden für jeden App-Lauf python manage.py schemamigration app_name --initialdie ersten Migrationsdateien für Ihre App erstellt
  6. Führen Sie dann South Migrate aus python manage.py migrate app_name, um die Tabellen zur Datenbank hinzuzufügen.

Einrichten eines Legacy-Projekts und einer Datenbank

  1. Hinzufügen von Süden zu installierten Apps
  2. Wenn Sie syncdb ausführen, werden die Südtabellen zur Datenbank hinzugefügt
  3. für jede Ihrer ausgeführten Apps python manage.py schemamigration app_name --initialDadurch werden Ihre ersten Migrationen erstellt
  4. Für jede Ihrer ausgeführten Apps python manage.py migrate app_name 0001 --fakewird dies nach Süden gefälscht, es wird nichts mit der Datenbank für diese Modelle zu tun haben. Es werden lediglich Datensätze zur Tabelle south_migrationhistory hinzugefügt, sodass Sie alle das nächste Mal sind, wenn Sie eine Migration erstellen möchten einstellen.

Einrichten eines Legacy-Projekts und keiner Datenbank

  1. Datenbank erstellen
  2. Hinzufügen von Süden zu installierten Apps
  3. für jede Ihrer ausgeführten Apps python manage.py schemamigration app_name --initialDadurch werden Ihre ersten Migrationen erstellt
  4. Wenn Sie syncdb ausführen, werden alle Apps hinzugefügt, die keine Migrationen zur Datenbank haben.
  5. Führen Sie dann South Migrate aus. Dadurch python manage.py migratewerden alle Migrationen für Ihre Apps ausgeführt.

Nachdem Sie South eingerichtet haben, können Sie South verwenden, um Modelländerungen an diesen Apps zu verwalten. Der am häufigsten auszuführende Befehl ist der python manage.py schemamigration app_name migration_name --auto, der die zuletzt ausgeführte Migration überprüft, die Änderungen findet und eine Migrationsdatei für Sie erstellt. Dann müssen Sie nur noch ausführen python manage.py migrateund Ihre Datenbank für Sie ändern.

Hoffentlich hilft das.

Ken Cochrane
quelle
3
Gute Antwort, Ken. Sie könnten darüber nachdenken, Ihre Antwort zu bearbeiten, um ein wenig mehr von dem einzubeziehen, was tatsächlich in dem Prozess schief gelaufen ist (siehe meinen Kommentar oben), damit zukünftige Leute, die über Ihre Antwort stolpern, die bestmöglichen Informationen erhalten.
Gabriel Hurley
@ Gabriel Ich mochte, wie Sie vorgeschlagen haben, und fügte meiner Antwort weitere Informationen hinzu. Danke für die Hilfe.
Ken Cochrane
1
Übrigens, dies dient dazu, Ihr Nicht-Süd-Projekt zu übernehmen und Süd hinzuzufügen, und nicht dazu, ein Projekt, das Süd bereits verwendet, zum Laufen zu bringen. In diesen Fällen ist eine Synchronisierung und Migration alles, was Sie benötigen sollten.
Bryan
11

So bringe ich die Dinge zum Laufen.

pip install South

# add 'south', to INSTALL_APPS, then
python manage.py syncdb

# For existing project + database
python manage.py convert_to_south app_name

# Thereafter, call them per model changes
python manage.py schemamigration app_name --auto
python manage.py migrate app_name

Verweise:

http://garmoncheg.blogspot.com/2011/08/django-how-and-why-to-use-migrations.html http://www.djangopro.com/2011/01/django-database-migration-tool -south-erklärt /

CppLearner
quelle
8

Das Tutorial, das Sie verwenden, lautet:

(Wenn dies fehlschlägt und Sie sich darüber beschweren, dass south_migrationhistory nicht existiert, haben Sie vergessen, syncdb auszuführen, nachdem Sie South installiert haben .)

Unter der Annahme, dass Ihr Beitrag die von Ihnen unternommenen Schritte genau beschreibt, scheint das Folgen dieses Links zu zeigen, dass Sie einen Schritt verpasst haben, bevor Sie Ihre neue App eingerichtet haben. Wenn Sie einem Lernprogramm zum Einrichten von Migrationen für eine neue Anwendung folgen, lautet die Reihenfolge wie folgt:

  1. In Süden zu INSTALLED_APPS.
  2. Ausführen syncdb.
  3. Dann das Tutorial folgen.

Das heißt, Sie sollten bereits ausgeführt haben, syncdbbevor Sie die Modelle für Ihre neue App hinzugefügt haben. Ihre Lösung zum Entfernen Ihrer App INSTALLED_APPSsollte funktionieren, aber es ist erwähnenswert, dass es sich wirklich nur um eine "dumme" Umgehung handelt, da Sie einen Schritt zuvor verpasst haben. Wurde syncdbausgeführt, bevor Sie die Modelle für diese App erstellt haben, müssten Sie die Problemumgehung nicht verwenden.

Andrew
quelle
3

Nur für zukünftige ref. Wenn South Ihnen Probleme bereitet:

  1. Entfernen Sie die Migrationsverzeichnisse aus Ihren App-Verzeichnissen
  2. Löschen Sie South _migrations aus Ihrer Datenbank
  3. Führen Sie manage.py syncdb aus
  4. Gehen Sie zurück zur Verwendung von South (z. B. './manage.py convert_to_south etwas, ./manage.py migrate ...')
Robert Johnstone
quelle
1

Dies scheint offensichtlich, aber ich würde das Lesen der Dokumente sehr empfehlen.

Selbst nachdem ich die Antworten auf diese Frage gelesen hatte, hatte ich Schwierigkeiten zu verstehen, wie man South effektiv nutzt.

Das hat sich natürlich an dem Tag geändert, an dem ich die Dokumente gelesen habe, und Sie sollten es auch tun. South ist einfacher zu bedienen, als Sie vielleicht denken.

http://south.aeracode.org/docs/about.html

http://south.aeracode.org/docs/tutorial/index.html

http://south.aeracode.org/docs/convertinganapp.html#converting-an-app

Ich fand das auch nützlich:

http://www.djangopro.com/2011/01/django-database-migration-tool-south-explained/

Und lesen Sie unbedingt Jeff Atwoods Coding Horror-Artikel zur Datenbankversionskontrolle.

Ashley Davis
quelle
+1 Ich bin gerade so weit gekommen, dass ich es so satt habe, all die seltsamen Südfehler zu beheben. Leider hilft SO nicht viel in Bezug auf den Süden. Vielleicht sollte ich mich wirklich hinsetzen und das Dokument lesen, wie Sie sagen.
Philip007
0

Wie bringe ich South dazu, zu arbeiten und mit allem richtig zu synchronisieren? Ich kann mir nur vorstellen, meine App aus INSTALLED_APPS zu entfernen, dann syncdb auszuführen und wieder hinzuzufügen.

Ich habe dieses Update in der Vergangenheit bei Südproblemen verwendet. Keine schöne Lösung, aber sehr effektiv;)

Das Hauptproblem ist jedoch, dass Ihre Bestellung nicht korrekt ist. Sie sollten syncdb vor dem Tutorial ausgeführt haben. Dann funktioniert es richtig.

Wolph
quelle