升级Django 1.5至1.11.10执行migrate遇NodeNotFoundError求助
解决Django 1.5升级到1.11.10时的NodeNotFoundError迁移问题
我之前踩过不少Django跨大版本升级的迁移坑,针对你遇到的这个问题,给你几个实用的解决方案:
1. 修正迁移文件的依赖关系
这个错误的核心是account.0004_auto_20180419_1309迁移里引用的admin迁移节点根本不存在。你需要:
- 找到项目中
account/migrations/0004_auto_20180419_1309.py文件 - 打开后查看
dependencies数组,定位到那个错误的admin依赖项:(u'admin', u'0003_advertisements_alignedcourses_api_integration_appreciation_certificate_company_company_types_contrib') - 替换成正确的admin迁移版本:
- 如果是Django默认的admin app,1.11版本的最后一个默认迁移是
0002_logentry_remove_auto_add,所以改成('admin', '0002_logentry_remove_auto_add') - 如果你的admin是自定义app(从你有
admin/apps.py来看大概率是),去admin/migrations/目录下找最新的迁移文件,比如如果最新的是0003_custom_change.py,就改成('admin', '0003_custom_change')
- 如果是Django默认的admin app,1.11版本的最后一个默认迁移是
2. 修复自定义admin app的迁移状态
既然你的项目有自定义的admin app,先确认它的迁移文件是否完整:
- 检查
admin/migrations/目录下的所有文件,有没有缺失或者命名异常的情况 - 如果admin app的迁移本身就有问题,先运行
./manage.py migrate admin --fake来强制标记admin的迁移为已完成,再尝试执行account的迁移
3. 清理迁移历史(谨慎操作)
如果上面的方法都无效,可能是跨版本升级导致迁移系统彻底混乱了,这时候可以尝试重置迁移(记得先备份数据库):
- 删除所有app下
migrations/目录里的文件(保留__init__.py) - 运行
./manage.py makemigrations重新生成所有app的初始迁移文件 - 运行
./manage.py migrate --fake-initial,让Django把现有数据库的状态标记为已完成初始迁移
额外提醒
从Django 1.5直接跳到1.11跨度太大了,中间跳过了迁移系统正式引入的1.7版本,很容易出问题。建议下次升级分步骤来:先升到1.7,处理好所有迁移和兼容性问题,再逐步升到1.8、1.9直到1.11,这样能减少很多莫名其妙的bug。
内容的提问来源于stack exchange,提问作者Akhi
相关产品推荐
相关产品推荐

