大型Django项目迁移问题咨询:分支合并时初始迁移冲突
Django迁移常见问题解决方案
一、何时创建新迁移
- 只要修改了
models.py里的模型定义(新增/删除字段、改字段类型/约束、加索引、变更模型元数据如verbose_name等),就需要创建新迁移。 - 执行
python manage.py makemigrations,Django会自动对比当前模型和已迁移版本的差异,生成对应迁移文件。 - 注意:仅修改模型的自定义方法(比如
save、clean),不需要创建迁移。
二、如何仅迁移指定模型/应用
- 只为某个应用生成迁移:
python manage.py makemigrations <app_name> - 仅执行某个应用的迁移:
python manage.py migrate <app_name> - 针对单个模型生成迁移(Django 3.2+支持):先执行
python manage.py makemigrations <app_name> --name <自定义迁移名> --empty生成空迁移文件,再手动在文件里编写该模型的操作(比如AddField、AlterField)。
三、分支合并时初始迁移(0001)冲突的解决
这是多分支开发的常见问题,根源是不同分支都修改了初始模型、生成了各自的0001迁移,合并时冲突。正确解决流程:
- 合并前拉取最新develop分支代码
在功能分支执行:git pull origin develop - 处理冲突的具体步骤
- 先把
models.py的冲突解决,保留最终正确的模型定义。 - 删除冲突的两个0001迁移文件。
- 重新生成初始迁移:
python manage.py makemigrations <app_name> --name initial - 让Django识别新迁移替代旧的冲突迁移:
python manage.py migrate <app_name> --fake-initial--fake-initial会告诉Django:这些表已经在数据库里了,不用实际创建,只把迁移记录到django_migrations表中。
- 先把
- 预防冲突的方法
- 开发前先拉取最新develop分支,缩小分支差异。
- 尽量不要在多个分支同时修改同一个模型的初始定义,必须改的话,先合并到develop再开新分支开发。
- 上线后的项目,别轻易改初始迁移,后续修改都通过新增迁移实现。
四、替代删迁移+重建数据库的正确操作
脚本删所有迁移和数据库的方法在团队协作或生产环境完全不可行,正确的重置/修复方式:
- 本地开发环境重置迁移:
# 清除django_migrations表中对应应用的记录 python manage.py sqlmigrate <app_name> 0001 | grep "DELETE FROM django_migrations" | python manage.py shell # 删除该应用migrations目录下除__init__.py外的所有迁移文件 rm <app_name>/migrations/0*.py # 重新生成迁移并标记为已执行 python manage.py makemigrations <app_name> python manage.py migrate <app_name> --fake-initial - 生产环境绝对不能删数据库,遇到迁移问题先备份,再用
--fake或编写自定义迁移修复。
内容的提问来源于stack exchange,提问作者Saidi Souhaieb
相关产品推荐
相关产品推荐

