Django未应用迁移问题求助:Python2转Python3及版本升级后异常
这种情况我之前在跨版本升级Django的时候也碰到过,咱们一步步来拆解原因和对应的解决办法:
可能的触发原因
- 数据库迁移记录不匹配:Django靠
django_migrations数据库表来追踪哪些迁移已经执行过。你同时做了Python版本迁移和Django大版本升级,可能这个表的旧记录和本地migrations文件夹里的文件在新版本Django下无法对应,导致系统误判有大量未应用迁移。 - 跨版本迁移兼容性问题:从Django 1.9直接跳到2.2,中间跨了好几个大版本,部分旧迁移文件的格式、语法或者依赖逻辑在新版本中不再兼容,Django无法正确识别它们已经被应用过。
- 多应用迁移依赖紊乱:如果项目包含多个APP,版本升级后某些APP的迁移依赖关系可能发生了变化,导致系统认为有迁移未按顺序执行。
具体解决步骤
第一步:先确认真实的迁移状态
先运行这个命令,查看每个APP的迁移标记情况:
python manage.py showmigrations
输出里带[X]的是已应用的迁移,没有标记的是系统认为未应用的。对比这个列表和你本地migrations文件夹里的文件,先搞清楚是真的有迁移没执行,还是系统误判。
情况1:系统误判(数据库结构和迁移文件一致)
如果确认数据库实际结构已经和所有迁移的最终状态匹配,只是django_migrations表记录不对,可以用fake迁移来标记所有未应用的迁移为已执行:
# 标记所有APP的迁移为已应用 python manage.py migrate --fake # 如果只是某个APP的问题,指定APP更安全 python manage.py migrate --fake your_app_name
⚠️ 注意:这个操作不会修改数据库结构,一定要确认你的数据库已经是最新状态再用,不然后续真实迁移会出问题。
情况2:确实存在迁移需要处理(跨版本导致的迁移冲突)
如果是因为跨版本升级导致迁移文件无法被正常识别,可以尝试以下步骤:
- 备份数据库和迁移文件:先把数据库和本地
migrations文件夹做备份,避免数据丢失。 - 合并冲突迁移:运行命令尝试自动合并冲突的迁移记录:
python manage.py makemigrations --merge - 重置迁移(极端情况):如果合并失败,可以尝试重置迁移流程:
- 先清空数据库里的
django_migrations表(记得先备份!) - 运行初始fake迁移,标记基础迁移为已应用:
python manage.py migrate --fake-initial - 重新生成适配新版本的迁移文件:
python manage.py makemigrations - 最后执行真实迁移:
python manage.py migrate
- 先清空数据库里的
额外注意事项
- 升级Django时一定要对应官方的版本升级指南,每个大版本之间(比如1.9→1.10→1.11→2.0→2.2)都有特定的迁移注意事项,比如字段变更、配置项废弃等,这些都可能影响迁移识别。
- 检查
settings.py里的INSTALLED_APPS,确保所有需要迁移的APP都已经正确注册,不然Django不会处理它们的迁移文件。
内容的提问来源于stack exchange,提问作者Moon




