删除migration文件夹后migrate提示No migrations to apply如何解决
问题诱因
Django的迁移执行状态不会随本地migrations文件夹的删除自动清除,所有迁移的执行记录都持久化保存在数据库内置的django_migrations表中。当你删除本地迁移文件夹后,框架扫描本地迁移文件、和数据库中存储的已执行迁移记录做比对时,会判定所有需要执行的迁移均已完成,因此返回No migrations to apply提示,和你本地是否实际留存迁移文件、是否手动执行过迁移操作没有直接关联。
解决方案
根据你是否需要保留现有数据库的业务数据,选择对应处理方案即可:
- 方案1:开发环境、无需保留现有数据库数据
- 清空/删除当前项目使用的数据库,使用默认SQLite数据库的话直接删除项目根目录下的
db.sqlite3文件即可 - 执行命令为所有应用重新生成迁移文件:
python manage.py makemigrations - 重新执行迁移命令即可完成表结构创建:
python manage.py migrate
- 清空/删除当前项目使用的数据库,使用默认SQLite数据库的话直接删除项目根目录下的
- 方案2:需要保留现有数据库中的业务数据,不可删库
- 连接项目使用的数据库,执行SQL语句删除
django_migrations表中对应应用的历史迁移记录(将命令中<your_app_name>替换为你删除了migrations文件夹的实际应用名):DELETE FROM django_migrations WHERE app = '<your_app_name>'; - 回到项目目录,执行命令为目标应用重新生成初始迁移文件:
python manage.py makemigrations <your_app_name> - 执行fake迁移命令,将新生成的初始迁移标记为已执行,和现有表结构对齐,不会重复执行建表SQL:
python manage.py migrate --fake <your_app_name> - 后续修改模型后正常执行
makemigrations、migrate命令即可正常识别结构变更。
- 连接项目使用的数据库,执行SQL语句删除
注意:
--fake参数仅会修改迁移记录状态,不会实际执行SQL修改表结构,执行前请确认新生成的初始迁移文件定义的表结构和数据库中现有表结构完全一致,避免后续迁移出现字段、表不匹配的报错。
相关场景截图:
内容的提问来源于stack exchange,提问作者Sergo
相关产品推荐
相关产品推荐

