SQLAlchemy присоединился к Eager Загрузка не работает - PullRequest
1 голос
/ 16 апреля 2020

У меня есть два класса 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, я получаю ожидаемый результат родителя со всеми его потомками.

Что я могу сделать, чтобы совместная загрузка работала?

...