Django生成迁移文件后执行migrate提示无迁移可应用、表未创建怎么办?
问题原因与对应解决方法
- 迁移记录被误标记为已应用
Django会将所有已执行的迁移记录存在数据库的django_migrations表中,如果你之前对machine应用执行过--fake迁移,或者删除过旧迁移文件后重新生成了同名的0001_initial.py,系统会认为该迁移已经完成,不会重复执行。
解决方法:
登录PostgreSQL的Houston库,执行SQL查询:
SELECT * FROM django_migrations WHERE app = 'machine' AND name = '0001_initial';
如果存在对应记录,执行删除:
DELETE FROM django_migrations WHERE app = 'machine' AND name = '0001_initial';
之后重新执行python manage.py migrate即可。
迁移目录不符合Django识别要求
检查你的machine应用下的migrations目录是否存在__init__.py文件,如果该文件缺失,Django无法扫描到目录下的迁移文件,自然不会执行。如果缺失手动创建空的__init__.py文件后重新执行迁移命令即可。配置文件存在语法错误
你提供的settings.py片段存在两处语法问题,若实际代码中也存在该问题会导致配置不生效:
INSTALLED_APPS列表最后用了}]闭合,多了多余的},正确应该只用]DATABASES配置缺少两个闭合符:default字典的闭合}和DATABASES字典的闭合}
修正语法后重启服务重新执行迁移即可。
- 数据库权限不足
确认postgres用户对Houston数据库拥有建表权限,可以直接登录PostgreSQL执行建表测试,如果权限不足可以给用户授权:
GRANT ALL PRIVILEGES ON DATABASE Houston TO postgres;
如果以上排查都没有解决,可以执行命令查看迁移的详细执行过程定位问题:python manage.py migrate -v 3
如果确认迁移文件正常,也可以先重置machine应用的迁移记录再重新执行:
python manage.py migrate --fake machine zero python manage.py migrate machine
内容的提问来源于stack exchange,提问作者Houston Khanyile
相关产品推荐
相关产品推荐

