Диалект-специфический c свойство модели в sqlalchemy - PullRequest
0 голосов
/ 03 августа 2020

У меня есть довольно сложный идентификатор объекта со структурой <datetime>#<uuid>, который я хотел бы обрабатывать на уровне модели как свойство, поэтому его можно использовать как в качестве свойства, так и в запросах. Поскольку я поддерживаю несколько бэкэндов базы данных, мне нужна реализация c с указанием диалекта.

Пример:

from sqlalchemy import Column
from sqlalchemy_utc import UtcDateTime
from sqlalchemy_utils import UUIDType


class Message(BaseModel):
    create_datetime = Column(UtcDateTime(timezone=True), nullable=False)
    uuid = Column(UUIDType(binary=False), nullable=False)

    @hybrid_property
    def message_id(self) -> str:
        return self.create_datetime.isoformat() + '#' + str(self.uuid)

# Usage patterns:
# message_id = message.message_id
# session.query(Message).filter_by(message_id=message_id)

Я пробовал hybrid_property.expression с пользовательскими FunctionElement и compiles, но я не могу передать значение внутри, чтобы сделать правильный запрос.

class get_message_id(FunctionElement):
    type = Text()
    name = 'get_message_id'  # required for some reason

@compiles(get_message_id)
def get_message_id_default(element, compiler, **kwargs):
    # Now what?

class Message(BaseModel):
    ...

    @message_id.expression
    def message_id(cls):
        return get_message_id()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...