gpt4 book ai didi

python - 在数据库中已有数据之后添加的 UUID 字段。有没有办法为现有数据填充 UUID 字段?

转载 作者:IT老高 更新时间:2023-10-28 21:11:10 29 4
gpt4 key购买 nike

我在一些模型中添加了一个 UUID 字段,然后使用 South 进行了迁移。我创建的任何新对象都正确填充了 UUID 字段。但是,我所有旧数据的 UUID 字段为空。

有没有办法为现有数据填充 UUID 数据?

最佳答案

对于以下示例类:

from django_extensions.db.fields import UUIDField

def MyClass:
uuid = UUIDField(editable=False, blank=True)
name = models.CharField()

如果您使用的是 South,请创建数据迁移:

python ./manage.py datamigration <appname> --auto

然后使用以下代码更新迁移,具体逻辑添加一个UUID:

from django_extensions.utils import uuid

def forwards(self, orm):
for item in orm['mypp.myclass'].objects.all():
if not item.uuid:
item.uuid = uuid.uuid4() #creates a random GUID
item.save()


def backwards(self, orm):
for item in orm['mypp.myclass'].objects.all():
if item.uuid:
item.uuid = None
item.save()

您可以创建不同类型的 UUID,每种 UUID 的生成方式都不同。 uuid.py module in Django-extensions包含您可以创建的 UUID 类型的完整列表。

请务必注意,如果您在包含大量对象的环境中运行此迁移,则可能会超时(例如,如果使用结构进行部署)。生产环境将需要另一种填充现有字段的方法。

在尝试对大量对象执行此操作时可能会出现内存不足(我们发现自己的内存不足并且部署失败,有 17,000 多个对象)。

为了解决这个问题,你 need to create a custom iterator在您的迁移中(或将其粘贴在真正有用的地方,并在您的迁移中引用它)。它看起来像这样:

def queryset_iterator(queryset, chunksize=1000):
import gc
pk = 0
last_pk = queryset.order_by('-pk')[0].pk
queryset=queryset.order_by('pk')
if queryset.count() < 1
return []
while pk < last_pk:
for row in queryset.filter(pk__gt=pk)[:chunksize]:
pk = row.pk
yield row
gc.collect()

然后您的迁移将变为如下所示:

class Migration(DataMigration):

def forwards(self, orm):
for item in queryset_iterator(orm['myapp.myclass'].objects.all()):
if not item.uuid:
item.uuid = uuid.uuid1()
item.save()

def backwards(self, orm):
for item in queryset_iterator(orm['myapp.myclass'].objects.all()):
if item.uuid:
item.uuid = None
item.save()

关于python - 在数据库中已有数据之后添加的 UUID 字段。有没有办法为现有数据填充 UUID 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12469638/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com