Django 与 SQL Server – GUID 类型映射为 char(32) 而不是 uniqueidentifier

问题描述 投票:0回答:1

我想要一个可以轻松使用不同数据库的应用程序。目前,我正在使用 SQLite 和 SQL Server,通过配置文件在它们之间切换。我注意到从性能的角度来看以下字段可能非常重要:

user_guid = models.UUIDField(
    default=uuid.uuid4,  
    editable=False,      
    unique=True,          
    null=False,          
    blank=False,         
    db_index=True        
)

在 SQL Server 中,该字段被映射为 char(32),我对此百感交集。随着时间的推移,我可能会切换到 PostgreSQL,但正如我之前提到的,我不太习惯使用 char(32) 而不是 uniqueidentifier。

sql-server django django-models
1个回答
2
投票

这是因为它 被指定为

char(32)
 [GitHub]:

class DatabaseWrapper(BaseDatabaseWrapper):
    # …
    data_types = {
        # …
        'UUIDField': 'char(32)',
    }
    # …

更改它也不容易:MSSQL 没有 native UUID 字段,可以使用

BINARY(16)
,但没有任何东西本身接受 UUID。
UUIDField
使用 [GitHub]:

将值转换为数据库的值
class UUIDField(Field):
    # …

    def get_db_prep_value(self, value, connection, prepared=False):
        if value is None:
            return None
        if not isinstance(value, uuid.UUID):
            value = self.to_python(value)

        if connection.features.has_native_uuid_field:
            return value
        return value.hex

    # …

因此它要么与

UUID
对象本身一起使用,要么与 UUID 字段的
.hex
一起使用,所以
VARCHAR
本质上存储了什么。

具有本机 UUID 字段的数据库(例如 PostgreSQL)使用该类型。

© www.soinside.com 2019 - 2024. All rights reserved.