Django中SQLite迁移数据至PostgreSQL遇唯一性约束错误求助
解决Django从SQLite迁移到PostgreSQL时loaddata的ContentType重复错误
错误原因
dumpdata默认会导出contenttypes表的数据,但当你在PostgreSQL上执行migrate完成表结构创建后,Django已经自动生成了对应应用的ContentType记录,导入时就触发了唯一约束冲突(app_label和model的组合已经存在)。
解决方案
方案1:导出时排除冲突表(推荐)
修改导出命令,跳过contenttypes和依赖它的auth.permission表,避免导出不必要的系统自动生成数据:
python -Xutf8 .\manage.py dumpdata --indent=4 --exclude=contenttypes --exclude=auth.permission --output=data.json
之后重新执行导入命令即可:
python .\manage.py loaddata data.json
方案2:导入时排除冲突表
如果已经生成了包含冲突数据的data.json,可以直接在导入时指定排除表:
python .\manage.py loaddata data.json --exclude=contenttypes --exclude=auth.permission
方案3:清空PostgreSQL中的ContentType记录(仅适用于全新数据库)
如果你的PostgreSQL数据库是刚初始化、migrate后无业务数据的状态,可以先清空自动生成的ContentType记录,再导入:
- 进入Django Shell:
python .\manage.py shell
- 在Shell中执行删除操作:
from django.contrib.contenttypes.models import ContentType ContentType.objects.all().delete() exit()
- 重新执行导入命令。
额外提示
导出时建议同时排除admin.logentry这类系统日志表,进一步减少导入冲突的可能性:
python -Xutf8 .\manage.py dumpdata --indent=4 --exclude=contenttypes --exclude=auth.permission --exclude=admin.logentry --output=data.json
内容的提问来源于stack exchange,提问作者MohNamdar
相关产品推荐
相关产品推荐

