У меня есть два класса Parent и Child, которые определены следующим образом:
class Child(Base):
id = Column(Integer, primary_key = True)
parent_id = Column(String(120), ForeignKey('parent.id'))
parent = relationship("Parent", back_populates = "children")
class Parent(Base):
id = Column(Integer, primary_key = True)
children = relationship("Child", back_populates = "parent", lazy='joined')
Если у меня есть определенный идентификатор Parent, который я хочу запросить для всех детей, я бы сделал
p = session.query(Parent).filter(Parent.id == desired_id).options(joinedload(Parent.children)).first()
Однако, когда я затем запрашиваю p для его дочерних элементов, используя p.children
, SQLAlchemy создает новый оператор SELECT для каждого дочернего элемента. Когда количество детей достаточно велико, это занимает вечность. Я ожидаю, что все дети будут загружены в список p.children
, установив параметр joinedload
. Почему это не работает?
Я могу добиться того же, написав свой собственный запрос на соединение, но это противоречит определению отношений в ORM.
Я знаю о настройке enable_eagerloads
, но ее использование по-прежнему не меняется.
Кроме того, когда я смотрю на эхо-журнал, я вижу, что команда raw SQL верна в том, что он также присоединяется к дочерней таблице. Когда я выполняю эту команду в SQL, я получаю ожидаемый результат родителя со всеми его потомками.
Что я могу сделать, чтобы совместная загрузка работала?