Django 1.11+Django-CMS项目从SQLite3迁移至MySQL失败求助
解决Django 1.11 + Django-CMS从SQLite迁移到MySQL的常见错误
我之前帮不少开发者解决过Django-CMS从SQLite迁MySQL的问题,你碰到的这两个错误其实都是迁移流程没踩对关键点导致的——一个是Django-CMS的树结构缓存没初始化,另一个是ContentType数据重复冲突。下面给你一套经过验证的步骤,能完美避开这两个坑:
一、先做好MySQL数据库的准备工作
- 先在MySQL里创建编码正确的数据库:
CREATE DATABASE my_cms_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 修改Django项目的
settings.py,替换数据库配置为MySQL:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'my_cms_db', 'USER': '你的数据库用户名', 'PASSWORD': '你的数据库密码', 'HOST': 'localhost', 'PORT': '3306', 'OPTIONS': { 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", }, } }
- 安装适配的MySQL驱动:
pip install mysqlclient(Django 1.11版本推荐用这个,兼容性最好)
二、初始化MySQL的基础表结构(关键!别直接导SQLite的dump)
很多人出错就是直接把SQLite的整个库导过去,但Django的ContentType、权限表在SQLite和MySQL里的生成逻辑不一样,直接导会冲突。先执行:
python manage.py migrate
这一步会帮你创建所有Django和Django-CMS的基础表,包括自动生成正确的ContentType数据,从根源避免重复条目错误。
三、导出SQLite的数据(排除冲突表)
用Django自带的dumpdata命令导出业务数据,但要排除那些会导致冲突的系统表:
python manage.py dumpdata --exclude contenttypes --exclude auth.permission --exclude cms.mpttpage > db_dump.json
为什么要排除这些表?
contenttypes:刚才migrate已经在MySQL里生成了,导入会触发重复主键错误auth.permission:权限和ContentType强关联,同样会重复cms.mpttpage:这是Django-CMS维护Page树结构的缓存表,会自动生成,手动导入反而会破坏树结构
四、把数据导入MySQL
确保MySQL的基础表已经创建完成,然后执行:
python manage.py loaddata db_dump.json
五、修复Page树结构(解决_node_cache错误)
导入数据后,Django-CMS的Page树节点缓存可能没正确初始化,这就是你碰到AttributeError: 'Page' object has no attribute '_node_cache'的原因。执行Django-CMS自带的修复命令:
python manage.py cms fix-tree
这个命令会重新构建Page模型的树节点缓存,彻底解决树结构相关的错误。
额外排查:如果还是碰到重复条目错误?
要是导入时还是出现1062 Duplicate entry,可以试试:
- 先清空MySQL里的
django_content_type表:TRUNCATE TABLE django_content_type; - 重新执行
python manage.py migrate,确保ContentType重新生成 - 再导入之前的
db_dump.json数据
最后验证迁移结果
启动服务器测试:
python manage.py runserver
检查网站前端内容、后台管理的Page操作是否正常,确认所有数据都迁移成功。
内容的提问来源于stack exchange,提问作者Dr3w Br1ck13
相关产品推荐
相关产品推荐

