Django с MSSQL Server - GUID Type отображается как char(32), а не как uniqueidentifier
Я хотел бы иметь приложение, которое может легко использовать различные базы данных. В настоящее время я использую SQLite и MSSQL, переключаясь между ними с помощью файла конфигурации. Я заметил, что следующее поле может быть очень важным с точки зрения производительности:
user_guid = models.UUIDField(
default=uuid.uuid4,
editable=False,
unique=True,
null=False,
blank=False,
db_index=True
)
В MSSQL поле отображается как char(32), и у меня смешанные чувства по этому поводу. Со временем я, возможно, перейду на PostgreSQL, но, как я уже говорил, мне не совсем удобно использовать char(32) вместо uniqueidentifier.
Это происходит потому, что он указан как char(32)
[GitHub]:
class DatabaseWrapper(BaseDatabaseWrapper): # … data_types = { # … 'UUIDField': 'char(32)', } # …
Changing it is also not easy: MSSQL has no native UUID field, one can use a BINARY(16)
, but there is nothing that accepts a UUID itself. The UUIDField
converts a value to a value for the database with [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
объектом, либо с .hex
полем UUID, то есть с тем, что VARCHAR
по сути хранит
Базы данных с собственным полем UUID, например PostgreSQL, используют этот тип.
Это происходит потому, что он указан как char(32)
[GitHub]:
class DatabaseWrapper(BaseDatabaseWrapper): # … data_types = { # … 'UUIDField': 'char(32)', } # …
Changing it is also not easy: MSSQL has no native UUID field, one can use a BINARY(16)
, but there is nothing that accepts a UUID itself. The UUIDField
converts a value to a value for the database with [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
объектом, либо с .hex
полем UUID, то есть с тем, что VARCHAR
по сути хранит
Базы данных с собственным полем UUID, например PostgreSQL, используют этот тип.
pyodbc
на момент создания пакета не поддерживал преобразование из uniqueidentifer
/SQL_GUID
в UUID
( проблема нативной поддержки )
поскольку следующее изменение было реализовано, написание uniqueidentifer
вместо char(32)
было реализовано без проблем
При этом отсутствие интереса к использованию MSSQL с Django и, следовательно, отсутствие официальной поддержки, вероятно, является причиной того, что это не реализовано как часть пакета
Обновление: