Django UUIDField从varchar(36)到char(32)截断

时间:2015-07-10 04:08:45

标签: python mysql django

升级到Django 1.8.3后,我需要从使用django_extensions.db.fields.UUIDField更改为新的django.db.models.UUIDField

问题是旧版本被定义为带有连字符的varchar(36),而新版本是char(32)没有连字符。 我肯定看到没有这些连字符的尺寸好处。

我试了一下,正如我所担心的那样,列中的数据会被截断。

当我检查字段的定义时,它用以下内容初始化:

def __init__(self, verbose_name=None, **kwargs):
    kwargs['max_length'] = 32
    super(UUIDField, self).__init__(verbose_name, **kwargs)

此定义会阻止对max_length的任何覆盖。

当然我可以更新每个UUIDFields我必须删除连字符,但这是一个相当长的过程,因为我的表非常大。 有关信息,这是我必须运行的那种查询:

UPDATE myTable
SET uuid_field = REPLACE(uuid_field, '-', '');

所以我的问题是,对于使用UUIDFields为每个表的每一行运行一个巨大的更新,你有什么更好的想法吗?

2 个答案:

答案 0 :(得分:1)

哦,更新数据库中的每个UUID字段太痛苦了,我重新实现了类似于旧django_extensions.db.fields.UUIDField的内容。

Django的第一个目标是Postgres,它有自己的UUID字段类型(没有连字符),但MySQL没有。

如果您正在创建一个新字段,Django的新UUIDField可以很好地工作,但如果您已有数据,则会很痛苦。

答案 1 :(得分:0)

我也遇到了同样的问题。最终只是走了一条简单的路线并定义了我自己的模型字段。

from django.db import models


class UUIDField(models.UUIDField):
    def __init__(self, *args, **kwargs):
        kwargs['max_length'] = 36
        super(models.UUIDField, self).__init__(*args, **kwargs)