团队并行开发时最常见的迁移问题:两个人各生成了 0002。Django 怎么发现的,merge 到底做了什么,它能保证合并后正确吗?这篇复现冲突,并故意制造一个「合并后仍然冲突」的例子。
migrate → To fix them run 'python manage.py makemigrations --merge'
makemigrations → To fix them run 'python manage.py makemigrations --merge'
showmigrations lab:
lab
[X] 0001_initial
[ ] 0002_add_a
[ ] 0002_add_b迁移之间的依赖是图,同一个 app 有两个「没有后继」的迁移就是分叉。
Merging lab
Branch 0002_add_a
+ Add field a to p
Branch 0002_add_b
+ Add field b to p
Created new merge migration <实验目录>
0003_merge_0002_add_a_0002_add_b.py 的内容:
# Generated by Django 6.1.1 on 2026-09-30 12:30
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('lab', '0002_add_a'),
('lab', '0002_add_b'),
]
operations = [
]
migrate → ['Applying lab.0002_add_b... OK', 'Applying lab.0002_add_a... OK', 'Applying lab.0003_merge_0002_add_a_0002_add_b... OK']合并迁移只是一个把 dependencies 指向两个叶子的节点,operations 默认为空。如果两个分支的操作会互相影响(比如改同一个字段),要手工在合并迁移里补操作。
[SQLite] 合并后 migrate: 没有报错;执行了 3 个迁移 | lab_p 的列: [('id', 'INTEGER'), ('name', 'varchar(20)'), ('x', 'INTEGER')]
[PostgreSQL] 合并后 migrate: 报错:django.db.utils.ProgrammingError: column "x" of relation "lab_p" already exists | lab_p 的列: id:bigint, name:character varying, x:textDjango 不分析两个分支的操作是否兼容。而且不同数据库的表现不同:SQLite 通过重建表悄悄把问题掩盖了,PostgreSQL 则报错——在 SQLite 上测试通过的迁移不代表在生产数据库上也行。