加载 back.json 文件时出现重复键问题(PostgreSQL)

10
我有一个PostgreSQL数据库,我执行了python manage.py dumpdata命令将数据备份到json文件中。我创建了一个新的PostgreSQL数据库,执行了迁移操作,一切都很顺利。但是当我尝试使用python manage.py loaddata backup.json命令加载备份的json文件时,它会出现以下错误。
Could not load contenttypes.ContentType(pk=15): duplicate key value violates unique constraint "django_content_type_app_label_76bd3d3b_uniq"
DETAIL:  Key (app_label, model)=(navigation, navigation) already exists.

我检查了phpPgAdmin,有一个名为News的行。有没有一种方式可以加载备份的json文件而不包括内容类型,或者更好的是倾销所有除内容类型数据以外的内容?

1
如果你只是排除ContentTypes,你可能会遇到另一个重复项,然后又是另一个,再然后是另一个。我认为这需要更广泛的方法改变。 - Vao Tsun
PostgreSQL原生的pg_restore和Django的loaddata之间存在一些差异。这篇文章清楚地解释了这些差异以及可能的解决方案- http://deephacks.com/articles/entry/django-backups-dumpdata-versus-sql-dump-postgresql-and-mysql/ 但正如@Vao Tsun建议的那样,最好深入了解您的数据中的约束问题。 - Mahesh H Viraktamath
2个回答

25

我也遇到了类似的错误:

django.db.utils.IntegrityError: 安装fixture '/home/knysys/ogmius/ogmius/db.json'时出现问题:无法加载contenttypes.ContentType(pk = 2):重复键值违反了唯一限制“django_content_type_app_label_model_76bd3d3b_uniq”DETAIL:键(app_label,model)=(auth,user)已经存在

后来,我发现如果您正在从另一个数据库恢复新数据库,需要像这样进行dumpdata

./manage.py dumpdata --exclude auth.permission --exclude contenttypes > db.json

然后像这样加载全新的数据库:

./manage.py loaddata db.json

这个可以运行,但现在我无法登录。 - sutan
@sutan 看起来 loaddata 命令已经覆盖了你的 users 表。也许你从 db.json 中加载了一个用户。 - ARKhan

5
你可以使用以下命令来加载数据:
python manage.py loaddata --exclude auth.permission --exclude contenttypes back.json

干杯。只是补充一下,为了防止用户被覆盖,还要添加 --exclude auth.user。而且我还需要添加 --exclude admin.logentry,因为我遇到了与未安装应用程序的 content_type ids 相关的错误。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接