Django合并Git迁移文件后执行migrate提示‘No migrations to apply’问题
为什么执行
migrate提示"No migrations to apply"但数据库没有新增字段? 这种情况我碰到过好几次,核心问题都是Django的迁移追踪机制和实际数据库状态不匹配,或者迁移文件本身存在依赖问题。下面分几种常见情况和对应的解决方法:
1. 数据库的迁移追踪表已经标记0002为已执行
Django靠django_migrations表来记录哪些迁移已经运行过。如果你的数据库里这条表已经有了对应app的0002_field1记录(比如之前误操作执行过,后来删除了迁移文件又拉回来),那Django就会默认这个迁移已经完成,哪怕实际数据库里没创建字段。
验证方法:
运行这条命令查看迁移状态:
python manage.py showmigrations your_app_name
如果输出里0002_field1前面是[X],说明Django认为它已经被应用了。
解决步骤:
- 先备份数据库! 这是重中之重,避免操作失误导致数据丢失。
- 进入数据库(比如用
python manage.py dbshell),执行删除记录的SQL:DELETE FROM django_migrations WHERE app='your_app_name' AND name='0002_field1'; - 重新执行迁移:
python manage.py migrate your_app_name
这时候Django就会重新运行0002迁移,把field1字段创建出来。
2. 迁移文件的依赖或内容存在不一致
如果你的0001_initial.py和你搭档生成0002_field1.py时用的0001版本不一致(比如搭档偷偷修改了0001的内容再生成0002),Django会因为迁移依赖的哈希不匹配,无法正确识别需要执行0002。
验证方法:
- 对比你本地的
0001_initial.py和Git仓库里的版本,看是否有差异。 - 打开
0002_field1.py,检查dependencies字段是不是[('your_app_name', '0001_initial')],确保依赖正确。
解决步骤:
- 确保你的
0001_initial.py是Git仓库里的最新版本(如果之前有本地修改,先合并或回滚)。 - 删除本地迁移的缓存文件:找到app目录下的
__pycache__文件夹,删除里面所有以000开头的缓存文件。 - 再次运行
python manage.py migrate your_app_name,如果还是不行,可以尝试先删除0002_field1.py,自己重新生成迁移:
然后把新生成的迁移文件推送到仓库,和搭档同步一下(避免后续冲突)。python manage.py makemigrations your_app_name
3. 执行migrate时指定了错误的范围
如果你直接运行python manage.py migrate而没有指定app,可能其他app的迁移都已完成,但Django没处理你目标app的迁移?不过这种情况比较少见,因为showmigrations会显示所有app的状态,你可以先确认目标app的0002是否未被标记为已执行。
内容的提问来源于stack exchange,提问作者adrian oviedo
相关产品推荐
相关产品推荐

