0

我可以将其合并到一个查询中并使其更快吗?我有表 Person 和 Cart(表中的 id 是从 Base 模型继承的)

class PersonModel(Base):
    __tablename__ = 'persons'
    username = Column(String(30), nullable=True, default=None)
    email = Column(String(75), nullable=True, default=None)
    password = Column(String(128), nullable=True, default=None)

class CartModel(Base):
    __tablename__ = 'carts'
    person_id = Column(Integer, ForeignKey('persons.id'), nullable=False, index=True)
    text = Column(String(300), nullable=True)
    began_at = Column(BigInteger, nullable=False)
    ended_at = Column(BigInteger, nullable=False, default=utc_time)
    datetime = Column(TIMESTAMP, server_default=func.now())
    money = Column(Float, default=0)
    quantity = Column(Integer, default=0)

我需要从人员中查找用户名,并从购物车中查找自时间 t 以来发生的所有购物车的数量。

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

如何将其粘合到一个查询中?

4

2 回答 2

0

除了 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 确实可以为您完成大量工作,因此值得一读。

于 2013-08-26T17:53:26.107 回答
0
session.query(CartModel).join(CartModel.person_id).filter(CartMode.ended_at >= t).all()

请参阅文档中的这一部分:http: //docs.sqlalchemy.org/en/latest/core/tutorial.html#using-joins

于 2013-08-26T13:33:05.813 回答