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

如何为Django自定义RunSQL迁移配置回退SQL?

问题

我有两个简单的迁移文件:

0001_initial.py

# Generated by Django 4.2.7 on 2023-11-30 11:15

from django.db import migrations, models


class Migration(migrations.Migration):
    initial = True

    dependencies = []

    operations = [
        migrations.RunSQL(
            """
            CREATE TABLE comments (
                id SERIAL PRIMARY KEY,
                contents VARCHAR(240) NOT NULL 
            );
            """
        ),
    ]

0002.py

# Generated by Django 4.2.7 on 2023-11-30 11:15

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ("polls", "0001_initial")
    ]

    operations = [
        migrations.RunSQL(
            """
            ALTER TABLE comments RENAME COLUMN contents to text;
            """
        ),
    ]

执行python manage.py migrate完成迁移后,我想要回退0002号迁移,于是运行python manage.py migrate polls 0001,但Django不知道如何回退该迁移的变更。请问如何告知Django,回退0002号迁移时需要执行以下SQL:

ALTER TABLE comments RENAME COLUMN text to contents;
解决方法

Django的RunSQL操作支持传入反向SQL语句,用来处理迁移回退场景。你只需修改0002.py中的RunSQL,添加reverse_sql参数并传入回退所需的SQL即可:

修改后的0002.py代码:

# Generated by Django 4.2.7 on 2023-11-30 11:15

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ("polls", "0001_initial")
    ]

    operations = [
        migrations.RunSQL(
            sql="""
            ALTER TABLE comments RENAME COLUMN contents to text;
            """,
            reverse_sql="""
            ALTER TABLE comments RENAME COLUMN text to contents;
            """
        ),
    ]

修改完成后,重新运行python manage.py migrate polls 0001,Django就会自动执行你指定的反向SQL完成回退操作。

内容的提问来源于stack exchange,提问作者Ivan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:26:03