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 и, следовательно, отсутствие официальной поддержки, вероятно, является причиной того, что это не реализовано как часть пакета

Обновление:

Вернуться на верх