如何为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
相关产品推荐
相关产品推荐

