0

我有两个具有一对多关系的表。

我想找到类型为“abc”的所有子行

class Parent(base):
    __tablename__ = "parent"
    id = Column("id", String, primary_key=True)
    parent = relationship("Child", back_populates="child")


class Child(base):
    __tablename__ = "child"
    id = Column("id", Integer, primary_key=True)
    name = Column(String)
    tid = Column(String, ForeignKey("parent.id"))
    child = relationship(Tenant, back_populates="parent")
    type = Column(String)


return self.session.query(Parent.parent).filter_by(Parent.parent.type == "abc").all()

它给了我错误,因为与 Parent.parent 关联的 InstrumentedAttribute' 对象和 'Comparator' 对象都有一个属性 'type'

如果我这样做

return self.session.query(Parent).filter(Parent.parent.any(Child.type == type)).all()

它也给了我所有其他类型的行

4

1 回答 1

2

这会做你想要的:

from sqlalchemy.orm import contains_eager

q = (session.query(Parent)
            .join(Child)
            .options(contains_eager(Parent.parent))
            .filter(Child.type == 'abc'))

for p in q:
    print(p.id, [c.name for c in p.parent])

contains_eager函数告诉 sqlalchemy,只有在查询中指定的引用集合的行应该被急切加载:在上面的示例中,只有Child带有 atype为“abc”的实例。

链接的文档警告说,仅返回相关集合的选择可能会导致问题:值得阅读警告并在设计应用程序时牢记这一点。

于 2020-11-15T18:15:56.783 回答