数据迁移高级模式:在已有表中安全添加非空字段
当线上数据库已有百万行数据时,如何优雅地添加一个非空字段并填充默认值,同时保证零宕机。 · 难度:入门 · +10XP
数据迁移高级模式:在已有表中安全添加非空字段
新手直接添加 non-null 字段会导致数据迁移失败或锁表。本教程教你三步法:1) 添加允许 null 的字段,2) 通过数据迁移(RunPython)填充数据,3) 改为非空。同时讲解如何利用 Django 的 migrations.RunPython 配合批量更新(update())避免内存溢出。以及如何在零停机场景下,先部署代码兼容新旧字段,再事后执行迁移。最后演示如何回滚迁移。
from django.db import migrations
def fill_slug(apps, schema_editor):
Product = apps.get_model('shop', 'Product')
for product in Product.objects.iterator():
product.slug = slugify(product.name)
product.save(update_fields=['slug'])
class Migration(migrations.Migration):
dependencies = [('shop', '0001_initial')]
operations = [
migrations.AddField(
model_name='product',
name='slug',
field=models.SlugField(null=True),
),
migrations.RunPython(fill_slug),
migrations.AlterField(
model_name='product',
name='slug',
field=models.SlugField(unique=True),
),
]