我想要一个可以轻松使用不同数据库的应用程序。目前,我正在使用 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。
这是因为它 被指定为
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)使用该类型。