How can I use UUIDs in SQLAlchemy?

后端 未结 8 1003
心在旅途
心在旅途 2020-12-07 10:58

Is there a way to define a column (primary key) as a UUID in SQLAlchemy if using PostgreSQL (Postgres)?

8条回答
  •  悲&欢浪女
    2020-12-07 11:41

    Here is an approach based on the Backend agnostic GUID from the SQLAlchemy docs, but using a BINARY field to store the UUIDs in non-postgresql databases.

    import uuid
    
    from sqlalchemy.types import TypeDecorator, BINARY
    from sqlalchemy.dialects.postgresql import UUID as psqlUUID
    
    class UUID(TypeDecorator):
        """Platform-independent GUID type.
    
        Uses Postgresql's UUID type, otherwise uses
        BINARY(16), to store UUID.
    
        """
        impl = BINARY
    
        def load_dialect_impl(self, dialect):
            if dialect.name == 'postgresql':
                return dialect.type_descriptor(psqlUUID())
            else:
                return dialect.type_descriptor(BINARY(16))
    
        def process_bind_param(self, value, dialect):
            if value is None:
                return value
            else:
                if not isinstance(value, uuid.UUID):
                    if isinstance(value, bytes):
                        value = uuid.UUID(bytes=value)
                    elif isinstance(value, int):
                        value = uuid.UUID(int=value)
                    elif isinstance(value, str):
                        value = uuid.UUID(value)
            if dialect.name == 'postgresql':
                return str(value)
            else:
                return value.bytes
    
        def process_result_value(self, value, dialect):
            if value is None:
                return value
            if dialect.name == 'postgresql':
                return uuid.UUID(value)
            else:
                return uuid.UUID(bytes=value)
    

提交回复
热议问题