SQL Alchemy在查询具有父级关系的Child时避免在Parent上进行二级联接

时间:2019-04-12 12:30:11

标签: python postgresql join sqlalchemy flask-sqlalchemy

我正在使用sqlalchemy。我有以下型号 当我用joinedloading询问父母时,我得到了孩子和狗。这是准确的。

chart.series[myIndex].show();
chart.series[myIndex].hide();

当我查询孩子时,我要求加入父母,但我也不希望父母元素也养狗。但这似乎是发生了什么事。

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')

2 个答案:

答案 0 :(得分:0)

由于Parent被配置为加入负载,因此它的关系就是这样做的。在这种情况下,您必须使用method chaining来明确禁用不需要的选项:

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

您还可以使用noload()raiseload()

答案 1 :(得分:0)

对于现在想知道如何实现这一点的任何人,您可以从 1.3.6 版开始指定子关系加载选项: https://docs.sqlalchemy.org/en/14/orm/loading_relationships.html#specifying-sub-options-with-load-options

char name[STR + 1];
char driver[STR + 1];