Django从SQLite迁移至PostgreSQL导入dump.json出现slug重复键错误
Django SQLite迁移PostgreSQL slug重复报错解决方案
报错原因
执行migrate命令生成表结构时,Django内置模块或自定义迁移逻辑会自动插入部分初始数据,你备份的db.json中存在的slug=superadmin记录和PostgreSQL库中已生成的初始记录唯一键冲突,导致导入失败。
另外你当前操作存在两处错误也可能加重问题:
- 导出的备份文件名为
db.json,导入时错误写为dump.json - 导入命令格式错误,正确格式为
loaddata(无空格)而非load data
解决方案
方案一:重置数据库后重新导入(优先推荐)
- 删除当前连接的PostgreSQL数据库,重新创建一个空白数据库
- 执行迁移命令,添加
--fake-initial参数跳过初始迁移的默认数据插入:
python manage.py migrate --fake-initial
- 使用正确命令导入备份数据:
python manage.py loaddata db.json
方案二:手动删除冲突记录后导入
如果无法重置数据库,直接修改备份文件跳过冲突项:
- 打开
db.json文件,搜索"slug": "superadmin"对应的整段数据条目,直接删除该条记录 - 清空PostgreSQL库中已生成的表数据:
python manage.py flush
- 执行正确的导入命令
- 导入完成后手动在后台创建slug为superadmin的对应记录即可
方案三:导入时排除冲突模型
如果冲突记录属于内置模块(比如站点、权限分组),可以在导入时直接排除对应模型:
# 示例为排除auth分组模型,你可以替换为实际冲突的模型路径 python manage.py loaddata db.json --exclude auth.group
验证操作
导入完成后执行以下命令验证数据完整性:
python manage.py check python manage.py shell -c "from django.contrib.auth.models import User; print('超级用户存在:', User.objects.filter(is_superuser=True).exists())"
内容的提问来源于stack exchange,提问作者usef
相关产品推荐
相关产品推荐

