Django模型新添加uuid字段后为现有数据批量生成uuid
背景:
模型新增uuid字段后如下,如果表中已有数据此时执行迁移默认生成的uuid会是重复的,因为有 unique=True 迁移失败。
1 uuid = models.UUIDField( 2 default=uuid1, 3 unique=True, 4 verbose_name='UUID', 5 )
解决办法:
1、先把字段改成,然后执行迁移生成为null的uuid字段
uuid = models.UUIDField( default=None, null=True, unique=True, verbose_name='UUID', )
2、执行SQL批量生成uuid
update table_name set uuid = UUID();
注意此时生成的uuid会因为字段长度限制和 '-' 导致uuid被截断,通过UUID检查如下:
>>>UUID('7fdbd19f-f21b-11ec-9afb-3bd1w45f') Traceback (most recent call last): File "<input>", line 1, in <module> File "c:\users\***\appdata\local\programs\python\python39\lib\uuid.py", line 177, in __init__ raise ValueError('badly formed hexadecimal UUID string') ValueError: badly formed hexadecimal UUID string
3、替换掉中划线
update table_name set uuid = REPLACE(uuid, '-', '');
4、补全被截断的部分
通过SQL语句 生成一堆 UUID发现最后一个 中划线后面的部分是固定的,可能是uuid1类型 和mac地址和时间相关的。
然后通过SQL语句补全被截断的后4位
update table_name set uuid = CONCAT(uuid, '9adc');