将老旧Django 0.97应用数据迁移至Django 1.8及更高版本的最优方案
从Django 0.97迁移数据到1.8的最优方案
既然你已经把models适配到1.8,空实例能正常跑,那核心问题就是数据的导出-转换-导入,我之前处理过类似的老版本迁移,给你梳理下最稳妥的步骤:
第一步:从旧0.97应用导出数据
先确保旧应用能正常启动(哪怕临时搭个极简环境),然后用Django自带的dumpdata命令导出全量数据:
python manage.py dumpdata --natural-foreign --natural-primary > old_data.json
--natural-foreign和--natural-primary是关键:用「自然键」(比如用户名、唯一标识字段)代替数据库主键ID导出,避免导入新实例时因为主键冲突导致失败(新实例的表会重新生成主键序列)。- 如果数据量很大,可以指定导出特定app,比如只导你的业务app和auth模块:
python manage.py dumpdata your_app auth > old_data.json
第二步:预处理导出的JSON数据
这一步是为了适配1.8的模型结构,你需要检查以下几点并调整:
- App名称/模型名变更:如果你的app在新环境里改了名字(比如旧叫
old_app新叫new_app),批量替换JSON里的"model": "old_app.XXX"为"model": "new_app.XXX"。 - 字段名变更:如果models里修改了字段名(比如旧
user_name新username),同样批量替换JSON中的字段键。 - 字段类型兼容:比如0.97的
BooleanField可能存的是0/1,dumpdata会自动转成JSON的true/false,但如果是自定义字段,可能需要手动调整格式;另外1.8新增的字段(比如User模型的is_active)如果旧数据没有,导入时会用默认值,不用额外处理。 - 清理冗余数据:可以删掉
django_session、django_admin_log这类临时/日志表的数据,这些在新环境里重新生成即可。
第三步:在新1.8应用中导入数据
先确保新应用的数据库已经做好初始化:
python manage.py migrate
然后导入预处理后的JSON:
python manage.py loaddata old_data.json
- 如果遇到主键冲突或者表已存在数据的错误,可以先清空目标表(比如用
python manage.py shell执行删除操作),或者导入时排除冲突的表:python manage.py loaddata old_data.json --exclude auth.user - 要是导入时触发了自定义信号(比如自动生成关联数据)导致报错,可以临时注释掉信号注册代码,导入完成后再恢复。
第四步:验证数据完整性
导入完成后,一定要做全面测试:
- 登录admin UI,检查每个模型的数据是否完整,关联关系(比如ForeignKey、ManyToMany)是否正常。
- 跑几个核心业务查询(比如通过shell查询关联数据),确认字段值没有异常。
- 检查用户权限、组等auth数据是否正确导入。
备选方案:直接数据库迁移(适合数据量极大的场景)
如果你的models结构和旧版本几乎一致,也可以直接操作数据库:
- 导出旧0.97数据库的业务表(避开
django_*开头的系统表)。 - 在新1.8数据库中创建好表结构(用
migrate命令)。 - 将旧表数据导入新表,注意调整字段类型(比如旧数据库的
datetime格式是否和新数据库兼容)。 - 重新生成Django的系统表数据(比如
django_content_type,可以通过migrate自动生成)。
这种方法效率更高,但需要你熟悉数据库结构,风险也稍大,建议先在测试环境验证。
内容的提问来源于stack exchange,提问作者DrFyzziks
相关产品推荐
相关产品推荐

