webentwicklung-frage-antwort-db.com.de

Warum funktionieren meine Südwanderungen nicht?

Zuerst erstelle ich meine Datenbank.

create database mydb;

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

Das Tutorial sagt mir, dies zu tun:

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

Toll, 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")

Also benutze ich Google (was nie funktioniert. Daher meine 870 Fragen zu Stackoverflow), und diese Seite wird angezeigt: http://groups.google.com/group/south-users/browse_thread/thread/d4c83f821dd2ca1c

Okay, ich folge diesen Anweisungen

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

Aber wenn ich syncdb starte, erstellt Django eine Reihe von Tabellen. Ja, es erstellt die Tabelle south_migrationhistory, aber erstellt auch die Tabellen meiner App.

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 anfänglichen Migrationen eine Mauer 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")

Tut mir leid, das ist wirklich sauer. Kann jemand helfen? Vielen Dank.

Wie erhalte ich die korrekte Synchronisierung von South mit allem? Das einzige, woran ich denken kann, ist, meine App aus INSTALLED_APPS zu entfernen, dann syncdb auszuführen und dann wieder hinzuzufügen.

Das ist SO SILLY.

79
TIMEX

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, für die bereits Tabellen in der Datenbank vorhanden sind. Der Schlüssel ist zu wissen, wann was zu tun ist. 

Ihr erster Fehler war, als Sie Ihre Migrationen gelöscht haben, sobald Sie das getan haben und dann syncdb ausgeführt haben. Django wusste nicht, dass Sie die App jetzt von South aus verwalten wollten, also erstellte er die Tabellen für Sie. Als Sie Ihre anfänglichen Migrationen erstellt und dann migriert haben, hat South versucht, Tabellen zu erstellen, die Django bereits erstellt hat, und damit Ihren Fehler.

An diesem Punkt haben Sie zwei Möglichkeiten.

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

  2. Fake out den ersten Migrationslauf aus $ py manage.py migrate wall 0001 --fake Dies weist South darauf hin, dass die Tabellen bereits in der Datenbank vorhanden sind, also fälschen Sie es einfach, wodurch eine Zeile zur south_migrationhistory-Tabelle hinzugefügt wird, so dass Sie beim nächsten Ausführen einer Migration davon erfahren dass die erste Migration bereits ausgeführt wurde.

Ein neues Projekt und keine Datenbank einrichten

  1. erstellen Sie Ihre Datenbank
  2. hinzufügen von Süd zu installierten Apps
  3. führen Sie syncdb aus. Dadurch werden die Django- und die South-Tabelle zur Datenbank hinzugefügt
  4. fügen Sie Ihre Apps hinzu
  5. für jede App, die python manage.py schemamigration app_name --initial ausgeführt wird, werden die ursprünglichen Migrationsdateien für Ihre App erstellt
  6. führen Sie dann South migrate python manage.py migrate app_name aus. Dadurch werden die Tabellen zur Datenbank hinzugefügt.

Einrichten eines alten Projekts und einer Datenbank

  1. hinzufügen von Süd zu installierten Apps
  2. führen Sie syncdb aus. Dadurch werden die südlichen Tabellen zur Datenbank hinzugefügt
  3. führen Sie für jede Ihrer Apps python manage.py schemamigration app_name --initial aus. Dadurch werden Ihre anfänglichen Migrationen erstellt
  4. für jede Ihrer Apps, die python manage.py migrate app_name 0001 --fake ausgeführt wird, führt dies zu einer Fälschung nach Süden. Die Datenbank wird für diese Modelle nicht verwendet. Es werden lediglich Datensätze zur Tabelle south_migrationhistory hinzugefügt, sodass Sie das nächste Mal, wenn Sie eine Migration erstellen möchten, dies tun alles bereit. 

Legacy-Projekt und keine Datenbank einrichten

  1. datenbank erstellen
  2. hinzufügen von Süd zu installierten Apps
  3. führen Sie für jede Ihrer Apps python manage.py schemamigration app_name --initial aus. Dadurch werden Ihre anfänglichen Migrationen erstellt
  4. führen Sie syncdb aus. Dadurch werden alle Apps, die keine Migrationen aufweisen, zur Datenbank hinzugefügt.
  5. führen Sie dann South migrate python manage.py migrate aus. Dadurch werden alle Migrationen für Ihre Apps ausgeführt.

Jetzt, wo Sie mit south eingerichtet sind, können Sie die Änderungen an diesen Apps mithilfe von south verwalten. Der am häufigsten auszuführende Befehl ist python manage.py schemamigration app_name migration_name --auto. Er wird die letzte durchgeführte Migration anzeigen, die Änderungen finden und eine Migrationsdatei für Sie erstellen. Dann müssen Sie einfach python manage.py migrate ausführen und Ihre Datenbank wird für Sie geändert.

Hoffentlich hilft das.

174
Ken Cochrane

So bekomme 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.htmlhttp://www.djangopro.com/2011/ 01/Django-Datenbank-Migrationswerkzeug-Süd erklärt/

10
CppLearner

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.)

Wenn Sie davon ausgehen, dass Ihr Beitrag die von Ihnen unternommenen Schritte genau beschreibt, scheint der folgende Link zu zeigen, dass Sie einen Schritt verpasst haben, bevor Sie Ihre neue App einrichten. Da Sie ein Lernprogramm zum Einrichten von Migrationen für eine neue Anwendung befolgen, lautet die Reihenfolge:

  1. Fügen Sie south zu INSTALLED_APPS hinzu.
  2. Führen Sie syncdb aus.
  3. Dann folgen Sie dem Tutorial.

Sie sollten syncdb bereits ausgeführt haben, bevor Sie Modelle für Ihre neue App hinzugefügt haben. Ihre Lösung, Ihre App aus INSTALLED_APPS zu entfernen, sollte funktionieren, aber es ist erwähnenswert, dass es sich eigentlich nur um eine "dumme" Umgehung handelt, da Sie zuvor einen Schritt verpasst haben. Wenn syncdb ausgeführt wurde, bevor Sie die Modelle für diese App erstellt haben, müssten Sie die Problemumgehung nicht verwenden.

8
Andrew

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

  1. Entfernen Sie die Verzeichnisse migrations aus Ihren Anwendungsverzeichnissen
  2. Löschen Sie Süd _ Migrationen aus Ihrer Datenbank
  3. Führen Sie manage.py syncdb aus
  4. Gehen Sie zurück zur Verwendung von Süd (beispielsweise './manage.py convert_to_south etwas, ./manage.py migrate ...'
3
Sevenearths

Dies erscheint offensichtlich, aber ich würde das Lesen der Dokumente wärmstens empfehlen.

Selbst nachdem ich die Antworten auf diese Frage gelesen hatte, hatte ich Schwierigkeiten zu verstehen, wie man Süd effektiv nutzen kann.

Das hat sich natürlich an dem Tag geändert, an dem ich die Dokumente gelesen habe, und Sie sollten auch, South ist einfacher zu benutzen, 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/

Lesen Sie auch die Artikel von Jeff Atwood zum Thema Coding Horror zur Versionskontrolle von Datenbanken.

1
Ashley Davis

Wie bekomme ich South zum Arbeiten und Synchronisieren mit allem richtig? Das einzige Was mir einfällt, ist meine App zu entfernen von INSTALLED_APPS aus, und führen Sie dann syncdb .__ aus. dann fügen Sie es wieder hinzu.

Ich habe dieses Problem in der Vergangenheit bei South-Problemen 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.

0
Wolph