Django CMS 3.5从SQLite迁移至PostgreSQL报错求助
解决Django CMS 3.5从SQLite迁移PostgreSQL的loaddata报错问题
我之前帮同事处理过几乎一模一样的Django CMS 3.x迁移PostgreSQL的坑,咱们先从你现有步骤里的问题说起,再给你一套经过验证的操作流程:
你当前步骤的核心问题
- 手动TRUNCATE
django_content_type是大忌:这个表的记录是Django自动维护的,和migrations的历史强关联,清空它会导致后续导入时外键关联、模型类型匹配全部混乱,绝对不能这么做。 - dumpdata时没有排除系统自动生成的表:
django_content_type、auth_permission这些表在执行migrate后已经自动生成了正确的记录,你把它们一起导出再导入,必然会触发唯一性冲突或者关联错误。
修正后的完整迁移流程
1. 重新导出SQLite数据(排除冗余系统表)
在SQLite开发环境下执行,确保只导出业务数据和Django CMS的核心数据:
python manage.py dumpdata \ --natural-primary \ --natural-foreign \ --exclude contenttypes \ --exclude auth.permission \ --exclude sessions \ --exclude admin.logentry \ --indent 2 > dump.json
--indent 2是为了让JSON文件更易读,方便后续排查错误;- 排除
sessions是因为开发环境的会话数据没必要带到生产,排除admin.logentry同理。
2. 切换到PostgreSQL生产配置
确保你的settings.py里已经正确配置PostgreSQL:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'your_db_name', 'USER': 'your_db_user', 'PASSWORD': 'your_db_password', 'HOST': 'localhost', 'PORT': '5432', } }
并且已经创建好数据库,给用户赋予足够的权限。
3. 执行数据库迁移
python manage.py migrate
这一步会自动创建所有需要的表,包括django_content_type、auth_permission这些系统表,以及Django CMS的所有核心表。
4. 导入数据
直接执行导入,不需要手动修改任何表:
python manage.py loaddata dump.json
如果仍然报错的排查方向
如果还是出现错误,大概率是SQLite和PostgreSQL的字段兼容性问题,比如:
- 主键序列不匹配:PostgreSQL的AutoField依赖序列生成主键,migrate后序列可能没有和导入数据的最大值对齐。可以用以下命令重置序列:
# 替换成你项目里的app名称,比如cms, menus, your_custom_apps python manage.py sqlsequencereset cms menus | python manage.py dbshell
- 文本字段长度限制:SQLite对TextField没有长度限制,但PostgreSQL某些场景下可能有约束。可以检查报错里提到的模型字段,临时修改模型字段为
models.TextField()再重新migrate,导入后改回(如果需要)。 - Django CMS特定模型的关联问题:如果是
cms_page、placeholder这类表报错,可以先在shell里清空对应表的数据(注意外键关联),再导入:
# 进入Django shell python manage.py shell # 清空CMS页面数据(会自动级联删除关联的占位符、插件等) from cms.models import Page Page.objects.all().delete() # 退出shell后再执行loaddata
内容的提问来源于stack exchange,提问作者Сергей Яхницкий
相关产品推荐
相关产品推荐

