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.
quelle
Antworten:
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.
Löschen Sie die Tabellen für die Wall-App aus Ihrer Datenbank und führen Sie sie aus.
$ py manage.py migrate wall
Dadurch wird die Migration ausgeführt und Ihre Tabellen erstellt.Fake out the initial migration run
$ py manage.py migrate wall 0001 --fake
Dies 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
python manage.py schemamigration app_name --initial
die ersten Migrationsdateien für Ihre App erstelltpython manage.py migrate app_name
, um die Tabellen zur Datenbank hinzuzufügen.Einrichten eines Legacy-Projekts und einer Datenbank
python manage.py schemamigration app_name --initial
Dadurch werden Ihre ersten Migrationen erstelltpython manage.py migrate app_name 0001 --fake
wird 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
python manage.py schemamigration app_name --initial
Dadurch werden Ihre ersten Migrationen erstelltpython manage.py migrate
werden 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ührenpython manage.py migrate
und Ihre Datenbank für Sie ändern.Hoffentlich hilft das.
quelle
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 /
quelle
Das Tutorial, das Sie verwenden, lautet:
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:
INSTALLED_APPS
.syncdb
.Das heißt, Sie sollten bereits ausgeführt haben,
syncdb
bevor Sie die Modelle für Ihre neue App hinzugefügt haben. Ihre Lösung zum Entfernen Ihrer AppINSTALLED_APPS
sollte funktionieren, aber es ist erwähnenswert, dass es sich wirklich nur um eine "dumme" Umgehung handelt, da Sie einen Schritt zuvor verpasst haben. Wurdesyncdb
ausgeführt, bevor Sie die Modelle für diese App erstellt haben, müssten Sie die Problemumgehung nicht verwenden.quelle
Nur für zukünftige ref. Wenn South Ihnen Probleme bereitet:
quelle
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.
quelle
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.
quelle