Sql alchemy Избегайте присоединений второго уровня к Parent при запросе Child с родительскими отношениями - PullRequest
0 голосов
/ 12 апреля 2019

Я использую sqlalchemy.У меня есть следующие модели, когда я запрашиваю родителя с объединенной загрузкой, я получаю детей и собак.Это точно.

Parent
    Children
    Dogs

Когда я запрашиваю ребенка, я и я прошу присоединиться к родителю, я не хочу, чтобы родительский элемент также получал собак.Но, похоже, именно это и происходит. Нет

Child:
    Parent:
        Dogs (i do not want this to be joined...its an unnecessary query. I just want the top level parent)

Я хочу, чтобы мой запрос был эффективным, поэтому я не хочу ненужных объединений.Есть ли флаг, который мне не хватает в моей модели, которая будет делать это.Основная причина, почему я хочу это, заключается в том, что я предполагаю, что сэкономлю время на запрос.

class Parent():
    __tablename__ = 'parent'
    __table_args__ = {'schema': 'test'}
    id = Column(Integer, primary_key=True)

    children = relationship(Child, lazy='joined', passive_deletes='all')
    dogs = relationship(Dogs, lazy='joined', passive_deletes='all')


class Child():
    __tablename__ = 'child'
    __table_args__ = {'schema': 'test'}
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('test.parent.id', ondelete="CASCADE"), nullable=False)

    parent = relationship('Parent', back_populates='children')

Так я делаю свои запросы

session.query(Child).options(joinedload(Child.parent)).all()

1 Ответ

0 голосов
/ 12 апреля 2019

Так как Parent настроен на объединение загрузки своих отношений, это то, что он делает.Вам придется явно отключить те, которые вам не нужны, в этом случае, используя метод цепочки :

session.query(Child).\
    options(joinedload(Child.parent).
            lazyload(Parent.dogs)).\
    all()

Вы также можете использовать noload()или raiseload().

...