Параметризация запроса SqlAlchemy на основе ORM - PullRequest
0 голосов
/ 07 января 2020

Я новичок в SqlAlchemy и пытаюсь выяснить лучший способ go о том, что я пытаюсь настроить.

Я переношу веб-приложение Flask / Postgresql из базового c драйвер psycopg2 для SqlALchemy ORM на основе, и у меня есть базовая c настройка, связанная с ORM.

Скажем, у меня есть объект базового уровня, называемый event.

У меня есть несколько users связанный с этим event.

Event имеет атрибуты created_date, _key, description.

Теперь, что я хотел бы достичь, так это Я запрашиваю что-то в event, а также автоматически возвращаю дополнительные вычисляемые атрибуты. Я понимаю, как создать вычисляемый атрибут на основе трех перечисленных мной столбцов (created_date, _key, description), но у меня есть дополнительное требование - разные пользователи будут иметь разные вычисляемые значения. Поэтому я хочу получить запрос пользователя c, в котором я могу передать идентификатор пользователя в @property, чтобы затем вычислить соответствующие значения.

Итак, сложив его, код будет выглядеть следующим образом :

class Event(Base):
        __tablename__ = 'activity'
        _key = Column(Integer, primary_key=True)
        created_date = Column(String)
        description = Column(String)

        @property
        def calculated_attribute(self):
            # Do some lookups here based on user_id
            calculated_attr = "ResultOfLogic"
            return calculated_attr

и затем выполните что-то вроде этого:

как user_id = 1

    with session_scope as session:
       session.query(Event).all()

и получите данные, подобные этому:

   description: "Description"
   created_date: "1/7/2020"
   calculated_attr: "Result calculated for user 1"

или для user_id=2:

   description: "Description"
   created_date: "1/7/2020"
   calculated_attr: "Something totally different"

Я попытался добавить self.user_id в конструктор init в Event, но кажется, что мы работаем с entities, а не с экземплярами классов с sqlalchemy. Возможно ли вообще то, что я пытаюсь сделать, или мне придется выполнять какую-то ручную работу для создания этих объектов после моего запроса? Я хотел бы иметь возможность использовать sql для сортировки этих свойств, что было одной из причин, по которой я пытался вычислить эти результаты при выполнении запроса.

1 Ответ

0 голосов
/ 09 января 2020

Для тех, кто пробирается сюда в поисках ответа:

Оказывается, вы можете сделать что-то вроде этого:

class Event(Base):
        user_id = None
        __tablename__ = 'activity'
        _key = Column(Integer, primary_key=True)
        created_date = Column(String)
        description = Column(String)

        @property
        def calculated_attribute(self):
            # Use user_id in here like self.
            return self.user_id + "Hi!"

Чем ваш запрос будет выглядеть так:

    with session_scope as session:
           Event.user_id = "Your_User_Id"
           session.query(Event).all()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...