如何创建Django手动迁移?解决迁移冲突报错问题
如何正确创建Django手动迁移并解决迁移冲突问题
我明白你现在是想通过migrations.RunSQL给PostgreSQL字段设置特定默认值,但之前的操作方式不小心搞出了迁移图冲突的错误。别担心,咱们一步步来搞定这个问题:
一、创建空白手动迁移的正确姿势
绝对不要复制旧迁移文件来改!这很容易破坏Django的迁移依赖链,导致你遇到的那种分支冲突。正确的做法是用Django自带的命令生成一个空白迁移文件:
python manage.py makemigrations --empty csmu
这里的csmu是你的app名称,运行后会生成一个只有基础结构的迁移文件,里面没有自动生成的数据库操作,完全由你手动控制内容。
二、编辑空白迁移文件,添加你的SQL操作
打开刚生成的空白迁移文件,按下面的示例修改,把你的SQL逻辑加进去:
from django.db import migrations from django.db.migrations.operations import RunSQL class Migration(migrations.Migration): # 这里一定要填对依赖:指向你app最近的一个有效迁移文件(比如你之前的0067_auto_20180509_2327) dependencies = [ ('csmu', '0067_auto_20180509_2327'), ] operations = [ # 执行设置默认值的SQL,同时可选添加回滚SQL(方便迁移回退) RunSQL( "ALTER TABLE csmu_your_table ALTER COLUMN your_field SET DEFAULT 'your_default_value';", reverse_sql="ALTER TABLE csmu_your_table ALTER COLUMN your_field DROP DEFAULT;" ) ]
替换掉示例里的表名、字段名和默认值,确保dependencies正确指向之前的迁移,这样Django的迁移图就会是线性的,不会出现分支。
三、解决你已出现的迁移冲突
你之前的操作导致了迁移图出现两个叶子节点(0067和0068),解决步骤如下:
- 先删除你手动复制修改的那个有问题的迁移文件(也就是0068_auto_20180514_0707)
- 运行下面的命令让Django自动合并迁移分支:
python manage.py makemigrations --merge
- 合并后如果生成的迁移文件里有多余的内容,你可以直接编辑它,保留正确的依赖和你需要的
RunSQL操作;或者直接用上面的空白迁移方法重新创建一个干净的手动迁移。
四、额外小贴士:非SQL方式设置默认值
如果你只是想给字段加普通的默认值,其实不用写SQL——直接在模型里修改字段的default参数,然后运行makemigrations即可,Django会自动生成对应的迁移文件。但如果是PostgreSQL专属的复杂默认值(比如用数据库内置函数),那RunSQL确实是最优解。
内容的提问来源于stack exchange,提问作者Keith John Hutchison
相关产品推荐
相关产品推荐

