You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行Django迁移后django_migrations表未更新,showmigrations显示未应用的原因

Django迁移已生效但showmigrations显示未应用的排查方案

我来帮你捋一捋这个有点诡异的问题——明明数据库已经同步了模型修改,migrate也提示成功,可showmigrations却显示这条迁移没被应用,这通常和Django追踪迁移状态的核心逻辑有关,咱们一步步排查:

可能的原因及解决办法

1. django_migrations表记录异常

Django靠django_migrations表来追踪哪些迁移已应用,要是这条记录缺失、哈希值不匹配,就会出现显示和实际不符的情况:

  • 先登录MySQL,执行SELECT * FROM django_migrations WHERE app = 'MYAPP' AND name = '0010_auto_20180406_1453';
    • 如果没有这条记录:手动插入一条,格式参考其他已应用的迁移记录,比如:
      INSERT INTO django_migrations (app, name, applied) VALUES ('MYAPP', '0010_auto_20180406_1453', NOW());
      
    • 如果有记录但哈希值不对:可以先回退到上一个迁移(比如0009),再重新生成迁移:
      # 回退到0009版本(确保0009是0010的前一个迁移)
      python manage.py migrate MYAPP 0009
      # 重新生成迁移
      python manage.py makemigrations MYAPP
      # 再次执行迁移
      python manage.py migrate MYAPP
      
    注意回退前要备份数据,避免丢失。

2. 迁移文件被事后修改

你执行migrate之后,如果修改了0010_auto_20180406_1453.py的内容,Django计算的文件哈希值会和django_migrations表里存储的不一致,就会判定这条迁移未应用:

  • 解决办法同上,回退到上一版本,重新生成并应用迁移,确保迁移文件生成后不再修改。

3. 多数据库配置导致的混淆

如果你的项目配置了多个数据库,执行migrate时可能没指定目标数据库,导致django_migrations表的更新发生在非默认数据库,而你查看的是默认库的状态:

  • 检查settings.py里的DATABASES配置,执行迁移时明确指定数据库:
    python manage.py migrate MYAPP --database=your_target_db
    
  • 查看状态时也指定数据库:
    python manage.py showmigrations MYAPP --database=your_target_db
    

4. 缓存或临时文件干扰

Django可能缓存了迁移状态,或者migrations目录下的__pycache__文件导致状态判断出错:

  • 删除MYAPP/migrations/__pycache__目录下的所有文件,然后重启Django服务,再执行showmigrations查看状态。

验证方法

你可以执行python manage.py sqlmigrate MYAPP 0010,对比生成的SQL语句和数据库中实际的表结构变化,如果完全一致,说明确实是迁移状态追踪的问题,而非数据库未更新。

内容的提问来源于stack exchange,提问作者user2849522

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:29:40