首页 > 其他分享 >表中添加唯一字段报错解决方案

表中添加唯一字段报错解决方案

时间:2022-09-25 23:22:34浏览次数:53  
标签:uuid 解决方案 migrations 添加 报错 Migration 表中 迁移 True

添加唯一字段的迁移

应用向具有现有行的表添加唯一不可为空字段的“普通”迁移将引发错误,因为用于填充现有行的值仅生成一次,从而破坏了唯一约束。

因此,应采取以下步骤。UUIDField在此示例中,我们将添加一个具有默认值的不可为空值。根据您的需要修改相应的字段。

default=uuid.uuid4使用和参数在模型上添加字段unique=True (为要添加的字段类型选择适当的默认值)。

1.运行makemigrations命令。这应该生成带有AddField操作的迁移。

2.运行两次makemigrations myapp --empty,为同一个应用生成两个空的迁移文件 。在下面的示例中,我们已重命名迁移文件以赋予它们有意义的名称。

3.将AddField操作从自动生成的迁移(三个新文件中的第一个)复制到最后一个迁移,更改AddField为 并添加和AlterField的导入。例如:uuidmodels

# Generated by Django A.B on YYYY-MM-DD HH:MM
from django.db import migrations, models
import uuid

class Migration(migrations.Migration):

    dependencies = [
        ('myapp', '0005_populate_uuid_values'),
    ]

    operations = [
        migrations.AlterField(
            model_name='mymodel',
            name='uuid',
            field=models.UUIDField(default=uuid.uuid4, unique=True),
        ),
    ]

4.编辑第一个迁移文件。更改unique=True为null=True,这将创建中间空字段并推迟创建唯一约束,直到我们在所有行上填充唯一值。
在文件0004_add_uuid_field.py

class Migration(migrations.Migration):

    dependencies = [
        ('myapp', '0003_auto_20150129_1705'),
    ]

    operations = [
        migrations.AddField(
            model_name='mymodel',
            name='uuid',
            field=models.UUIDField(default=uuid.uuid4, null=True),
        ),
    ]

5.在第一个空的迁移文件中,添加一个 RunPythonor RunSQL操作来为每个现有行生成一个唯一值(示例中为 UUID)。还要添加uuid. 例如在0005_populate_uuid_values.py中

# Generated by Django A.B on YYYY-MM-DD HH:MM
from django.db import migrations
import uuid

def gen_uuid(apps, schema_editor):
    MyModel = apps.get_model('myapp', 'MyModel')
    for row in MyModel.objects.all():
        row.uuid = uuid.uuid4()
        row.save(update_fields=['uuid'])

class Migration(migrations.Migration):

    dependencies = [
        ('myapp', '0004_add_uuid_field'),
    ]

    operations = [
        # omit reverse_code=... if you don't want the migration to be reversible.
        migrations.RunPython(gen_uuid, reverse_code=migrations.RunPython.noop),
    ]

最后正常只执行migrate命令就可以对现在的数据表添加唯一字段了

标签:uuid,解决方案,migrations,添加,报错,Migration,表中,迁移,True
From: https://www.cnblogs.com/zonghan/p/16729370.html

相关文章