Python 如何将嵌套for循环中的两个查询粘合在一起?
我可以将此合并到一个查询并使其更快吗 我有TablePerson和Cart(表中的id继承自基本模型) 我需要从人员中查找用户名,并从carts中查找自时间t以来发生的所有carts的数量Python 如何将嵌套for循环中的两个查询粘合在一起?,python,python-2.7,sqlalchemy,Python,Python 2.7,Sqlalchemy,我可以将此合并到一个查询并使其更快吗 我有TablePerson和Cart(表中的id继承自基本模型) 我需要从人员中查找用户名,并从carts中查找自时间t以来发生的所有carts的数量 result = [] for c in session.query(CartModel).filter(CartMode.ended_at >= t).all(): p = session.query(PersonModel).filter(PersonModel.id == c.person
result = []
for c in session.query(CartModel).filter(CartMode.ended_at >= t).all():
p = session.query(PersonModel).filter(PersonModel.id == c.person_id).first()
if p:
result.append((p.username, c.quantity))
如何将其粘附到一个查询
session.query(CartModel).join(CartModel.person_id).filter(CartMode.ended_at >= t).all()
参考文档中的这一部分:除了bpergo的答案之外,我建议您建立关系。我给你一个快速的解决方案,但我强烈推荐阅读。这是一个已经非常好的文档中最有价值的文档之一 简而言之:关系的概念是SQLAlchemy可以自动构建所需的查询:
class PersonModel(Base):
...
carts = relationship("CartModel", backref="person")
通过此修改,您可以非常轻松地执行以下操作:
for c in session.query(CartModel).filter(CartMode.ended_at >= t):
p = c.person
...
但是,您必须注意:仅使用此解决方案,最终可能会出现大量查询(请参阅)。相反,这样做会产生更少的查询:
for c in session.query(CartModel).option(joinedload(PersonModel)).filter(CartModel.ended_at >= t):
p = c.person
...
不,我相信这并不容易理解。但我向你保证,这是值得一读的,因为如果你了解人际关系,SQLAlchemy真的可以让你的手做很多工作
for c in session.query(CartModel).option(joinedload(PersonModel)).filter(CartModel.ended_at >= t):
p = c.person
...