You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建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),解决步骤如下:

  1. 先删除你手动复制修改的那个有问题的迁移文件(也就是0068_auto_20180514_0707)
  2. 运行下面的命令让Django自动合并迁移分支:
python manage.py makemigrations --merge
  1. 合并后如果生成的迁移文件里有多余的内容,你可以直接编辑它,保留正确的依赖和你需要的RunSQL操作;或者直接用上面的空白迁移方法重新创建一个干净的手动迁移。

四、额外小贴士:非SQL方式设置默认值

如果你只是想给字段加普通的默认值,其实不用写SQL——直接在模型里修改字段的default参数,然后运行makemigrations即可,Django会自动生成对应的迁移文件。但如果是PostgreSQL专属的复杂默认值(比如用数据库内置函数),那RunSQL确实是最优解。

内容的提问来源于stack exchange,提问作者Keith John Hutchison

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:27:57