任何具有更深入SQLAlchemy知识的人都可以解释为什么它似乎向DB发送多个查询而不仅仅是如下所述的那个查询?
查询如下所示:
session.query(Orders).filter(
Orders.user_id == user_id,
Orders.created_on <= now,
Orders.created_on > 30_days_ago
).order_by(
Orders.status,
Orders.created_on.desc()
).all()
(Orders.status只是一个整数,如1 =&gt;&#34;发货&#34; 2 =&gt;&#34;完成&#34; 3 =&gt;&#34;返回&#34;)< / p>
我期望向DB发出一个单独的查询,其逻辑与(在Postgres中)逻辑相同:
SELECT *
FROM Orders
WHERE
user_id = :user_id and
created_on < now() and
created_on >= now() - interval '30 days'
ORDER BY status, created_on DESC;
假设上面的查询返回10行,其中id为1-11。 从Postgres日志中发现到数据库的实际内容是针对每行检索的单个查询。
SELECT *
FROM Orders
WHERE id = 1;
SELECT *
FROM Orders
WHERE id = 2;
SELECT *
FROM Orders
WHERE id = 3;
...
最后不得不使用session.execute()
代替session.query()
。幸运的是,在这种情况下,应用程序不依赖于会话是最新的。
编辑 - 添加有关订单模型的更多信息
Base = declarative_base()
class Orders(Base)
__tablename__ = "Orders"
id = Column(Integer, primary_key=True)
user_id = Column(Integer, nullable=False, index=True)
name = Column(String, nullable=False, index=True, index=True)
category = Column(String, nullable=False)
status = Column(Float, nullable=False)
created_on = Column(DateTime, nullable=False)
def __init__(self, user_id, name, category, status, created_on):
self.user_id = user_id
self.name = name
self.category = category
self.status = priority
self.created_on = datetime.datetime.utcnow()
该表在user_id列和名称列上有一个索引。