表中添加唯一字段报错解决方案
添加唯一字段的迁移
应用向具有现有行的表添加唯一不可为空字段的“普通”迁移将引发错误,因为用于填充现有行的值仅生成一次,从而破坏了唯一约束。
因此,应采取以下步骤。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命令就可以对现在的数据表添加唯一字段了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了