Was soll ich in Django 1.9 anstelle von syncdb verwenden?

70

Schau dir das an:

$ pypy ./manage.py syncdb
/usr/lib64/pypy-2.4.0/site-packages/django/core/management/commands/syncdb.py:24: RemovedInDjango19Warning: The syncdb command will be removed in Django 1.9
  warnings.warn("The syncdb command will be removed in Django 1.9", RemovedInDjango19Warning)

(cut)

Ich habe eine schnelle Google-Suche durchgeführt , konnte aber keine Antwort finden. Was soll ich stattdessen verwenden syncdb?

d33tah
quelle
2
Eigentlich, jetzt wo ich wieder hinschaue, ist es genau dort:syncdb has been deprecated and replaced by migrate
d33tah

Antworten:

89

syncdbist aufgrund des mit django 1.7 eingeführten Migrationssystems veraltet .

Jetzt können Sie Ihre Änderungen mit verfolgenmakemigrations . Dadurch werden Ihre Modelländerungen in Python-Code umgewandelt, damit sie für andere Datenbanken bereitgestellt werden können. Wenn Sie weitere Änderungen an der Datenbank vornehmen müssen, können Sie Datenmigrationen verwenden .

Nachdem Sie die Migrationen erstellt haben, müssen Sie sie anwenden : migrate.

Also anstatt zu verwenden syncdb, sollten Sie makemigrationsund dann verwenden migrate.

Workflow für die Entwicklung, nachdem Sie etwas an Ihren Modellen geändert haben:

./manage.py makemigrations
./manage.py migrate

Und auf Ihrem Produktionssystem:

./manage.py migrate

Bonus: Sie müssen nicht migratefür jede Änderung laufen . Wenn Sie mehrere Änderungen noch nicht angewendet haben, führt django sie in der für Sie richtigen Reihenfolge aus.

tjati
quelle
2
Es ist die beste neue Funktion;)
tgdn
9
HINWEIS: makemigrationsMöglicherweise ist der Modulname als Parameter erforderlich.
d33tah
1
Das ist ein schrecklicher Rat. Wenn Sie eine App mit einem Dutzend Migrationen in eine leere Datenbank installieren, sollten Sie diese niemals ausführen, migrateda dies eine enorme Zeitverschwendung darstellt. @ Don Mums Antwort ist die richtige Antwort.
Cerin
56

Sie sollten auf jeden Fall das Migrationssystem verwenden . Auf diese Weise können Sie Änderungen in Ihrer models.pyDatenbank verfolgen und Migrationen für die Datenbank erstellen. Das Migrationssystem verwendet die Befehle makemigrations, um Migrationen zu erstellen und migratedie Datenbank zu migrieren.

Wenn Sie aus irgendeinem Grund eine Datenbank auf die gleiche Weise erstellen müssen, syncdbgibt es ein Befehlsflag, das bewirkt, dass es migrateauf die gleiche Weise funktioniert. Sie sollten dies nur tun, wenn Sie es WIRKLICH brauchen und wissen, was Sie tun. Zum Beispiel, um eine leere Datenbank für ein kontinuierliches Integrationssystem Ihrer Wahl zu erstellen.

python manage.py migrate auth
# performs migrations for auth and contenttypes contrib apps

python manage.py migrate --run-syncdb
# creates the rest of the database

Getestet auf Django 1.9.1.

Lampenstadt-Typ
quelle
10
+1 für die eigentliche Lösung sollte dies die Antwort sein. Während Sie Migrationen für Produktionsversionen verwenden sollten, wenn Sie aktiv von Grund auf neu entwickeln, ist es einfacher, die Datenbank zu löschen und neu zu starten, als 500 Migrationen auszuführen. Ich laufe routinemäßig, dropdb mydb && createdb mydb && python manage.py migrate --run-syncdbwenn ich etwas ändere.
Dotcomly
--run-syncdbscheint nur auf Apps zu funktionieren, die keine Migrationen haben. Ich habe die folgende find -name "migrations" -exec mv {}/__init__.py {}/__init__ \; && python manage.py migrate && python manage.py migrate --run-syncdb && find -name "migrations" -exec mv {}/__init__ {}/__init__.py \; && python manage.py migrate --fake
Problemumgehung
3

syncdbhat ein Problem mit der Datenbankmigration. also nach django 1.7 makemigrationsund migratewurden eingeführt. Jetzt in Django ist 1.9 syncdbveraltet. try
1. python manage.py makemigrationserkennt Änderungen in der Datenbank und erstellt eine .pyDatei im Migrationsordner 2. python manage.py migratewendet die Migrationen auf die Datenbank an

Amrendra
quelle