使用具有一对多关系的父 table 过滤子 table 中的行 sqlalchemy

Filter rows in child table using parent table having one to many relationship sqlalchemy

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

我想找到类型为“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()

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

如果我这样做

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

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

这会做你想做的事:

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 个具有 type 的实例'abc'.

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