Основной запрос сопоставленного атрибута - PullRequest
1 голос
/ 24 августа 2011

Если у меня есть экземпляр с отображением sqlalchemy. Могу ли я получить базовый динамический объект запроса, соответствующий атрибуту указанного экземпляра?

Например:

e = Employee()
e.projects

#how do I get a query object loaded with the underlying sql of e.projects

Ответы [ 2 ]

2 голосов
/ 24 августа 2011

Я думаю, вы описываете lazy="dynamic" свойство relationship(). что-то вроде

 class Employee(Base):
     __table_name__ = "employees"
     ...

     projects = relationship(..., lazy="dynamic")

, что заставит Employee().project вернуть экземпляр sqlalchemy.orm.Query вместо коллекции, содержащей связанные элементы. Однако это означает, что нет (простого) способа прямого доступа к коллекции. Если вам это все еще нужно (скорее всего, вы действительно хотите, чтобы он загружался лениво, установите вместо него два relationship().

 class Employee(Base):
     __table_name__ = "employees"
     ...

     projects_query = relationship(..., lazy="dynamic")
     projects = relationship(..., lazy="select")

редактировать: вы сказали

Мне нужно каким-то образом получить объект динамического запроса уже привязанного свойства привязанного отношения.

Предположим, у нас есть экземпляр i класса Foo, связанный с классом Bar свойством bars. Во-первых, нам нужно получить свойство, которое обрабатывает отношения.

from sqlalchemy.orm.attributes import manager_of_class
p = manager_of_class(Foo).mapper.get_property('bars')

Нам нужно выражение, которое and_ объединяет все столбцы в i, которые связывают его с bars. Если вам нужно работать с Foo через псевдоним, замените его здесь.

e = sqlalchemy.and_(*[getattr(Foo, c.key) == getattr(i, c.key)
                      for c in p.local_side])

Теперь мы можем создать запрос, который выражает эту связь. Подставьте псевдонимы для Foo и Bar здесь при необходимости.

q = session.query(Foo) \
           .filter(e) \
           .join(Foo.bars) \
           .with_entities(Bar)
0 голосов
/ 24 августа 2011

Не уверен насчет вопроса в целом, но вы определенно можете включить ведение журнала SQL, установив echo = True , который будет регистрировать оператор SQL, как только вы попытаетесь получить значение атрибута.
В зависимости от конфигурации relationship она может быть предварительно загружена.

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