Schalt-Django-Projekt von sqlite3-backend-postgresql aufgibt beim laden datadump
Ich bin derzeit mit sqlite3 wie die DB für einen meiner Django-Projekte. Ich möchte dies ändern, um die Verwendung von postgresql, und ich möchte zu halten, alle Daten intakt.
Ich verwendet ./manage.py dumpdata > dump.json
erstellen Sie einen dump der Daten, und änderte meine Einstellungen für die Verwendung von postgresql. Versuche erstmal mit einer leeren Datenbank zu tun ./manage.py loaddata dump.json
führte zu Fehler zu Tabellen, die nicht vorhandene, also lief ich ./manage.py syncdb
, und versuchte es erneut. Dass dieser Fehler führt:
Problem installing fixture 'dump.json': Traceback (most recent call last):
File "/usr/lib/python2.6/site-packages/django/core/management/commands/loaddata.py", line 163, in handle
obj.save()
File "/usr/lib/python2.6/site-packages/django/core/serializers/base.py", line 163, in save
models.Model.save_base(self.object, raw=True)
File "/usr/lib/python2.6/site-packages/django/db/models/base.py", line 495, in save_base
rows = manager.filter(pk=pk_val)._update(values)
File "/usr/lib/python2.6/site-packages/django/db/models/query.py", line 448, in _update
return query.execute_sql(None)
File "/usr/lib/python2.6/site-packages/django/db/models/sql/subqueries.py", line 124, in execute_sql
cursor = super(UpdateQuery, self).execute_sql(result_type)
File "/usr/lib/python2.6/site-packages/django/db/models/sql/query.py", line 2347, in execute_sql
cursor.execute(sql, params)
File "/usr/lib/python2.6/site-packages/django/db/backends/util.py", line 19, in execute
return self.cursor.execute(sql, params)
IntegrityError: duplicate key value violates unique constraint "django_content_type_app_label_key"
- Ist dies nicht der richtige Weg, um Daten von einer Datenbank zu einer anderen?
- Was soll ich tun um zu wechseln, DB back-End sicher?
- ich ignorierte einige django-Tabellen.
./manage.py dumpdata -e sessions -e admin -e contenttypes -e auth.Permission -e authtoken --natural > db.json
und dann hat./manage.py loaddata db.json
. Vielleicht hilft es ja jemandem. Für details, siehe diese Frage stackoverflow.com/questions/853796/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist einfach, dass Sie immer die Inhaltstypen definiert, die zweimal - einmal, wenn Sie tun
syncdb
, und einmal durch die exportierten Daten, die Sie importieren möchten. Da können Sie auch andere Elemente in Ihrer Datenbank, die abhängig von der ursprünglichen content-type-Definitionen, die ich empfehlen würde, halten diese.So, nach dem ausführen
syncdb
tunmanage.py dbshell
und in Ihrer Datenbank tunTRUNCATE django_content_type;
entfernen Sie alle neu definierte content-Typen. Dann sollten Sie nicht get-Konflikte - auf, dass ein Teil des Prozesses, in jedem Fall.TRUNCATE django_content_type CASCADE;
aber es hat Super geklappt!django.db.utils.IntegrityError: Problem installing fixture 'C:\myproject\dump.json': Could not load Authentication.Profile(pk=368): duplicate key value violates unique constraint "Authentication_profile_user_id_key" DETAIL: Key (user_id)=(720) already exists.
python manage.py dumpdata --natural-foreign --natural-primary -e auth.Permission --indent 4 > datadump.json
), aber jetzt bekam ich eine andere Fehlermeldung:DETAIL: Key (user_id)=(1) already exists.
Bitte helfen 🙁Gibt es eine große Diskussion darüber auf der Django ticket-7052. Der richtige Weg nun ist die Verwendung des
--natural
parameter, Beispiel:./manage.py dumpdata --natural --format=xml --indent=2 > fixture.xml
Damit
--natural
arbeiten mit Ihren Modellen, die Sie implementieren müssennatural_key
undget_by_natural_key
, wie beschrieben, auf die Django-Dokumentation über Natürliche Schlüssel.Gesagt, dass Sie vielleicht noch brauchen, um die Daten zu Bearbeiten, bevor Sie es importieren mit
./manage.py loaddata
. Zum Beispiel, wenn Ihre Anwendungen geändertsyncdb
füllen Sie die Tabelledjango_content_type
und möchten Sie vielleicht zu löschen die entsprechenden Einträge aus der xml-Datei, bevor Sie geladen werden.Dieser arbeitete für mich. Sie wahrscheinlich wollen, um sicherzustellen, dass der server gestoppt, so dass keine neuen Daten verloren gehen. Es Dump:
Stellen Sie sicher, dass Ihre Modelle nicht haben-Signalen (z.B. post_save) oder alles, was erstellt die Modelle. Wenn Sie tun, kommentieren Sie es aus momentan.
Bearbeiten settings.py zeigen Sie auf die neue Datenbank, und stellen Sie es:
Laden der Daten: