使用具有一对多关系的父 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'.
链接文档警告仅返回相关集合的一部分可能会导致问题:值得阅读警告并在设计应用程序时牢记这一点。
我有两个具有一对多关系的表。
我想找到类型为“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'.
链接文档警告仅返回相关集合的一部分可能会导致问题:值得阅读警告并在设计应用程序时牢记这一点。