执行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
相关产品推荐
相关产品推荐

