下面是我使用SQLAlchemy进行SQL查询的伪代码:
from sqlalchemy.orm import query
query = MyClass.query
if arg1:
query = query.filter(MyClass.f1 == arg1)
if arg2:
query = query.filter(MyClass.f2 == arg2)
if arg3:
query = query.filter(MyClass.f3 == arg3)
res = jsonify(requests=[r.to_dict() for r in query])
return res
我计算了代码中每个步骤的持续时间,惊讶地发现query.filter
非常快(~0.0001s),而限速步骤是jsonify(requests=[r.to_dict() for r in query])
(~0.3s!)这怎么解释?
这是我的日志:
f1 time 0.0002
f2 time 0.0001
2023-05-04 09:37:09,667 INFO sqlalchemy.engine.base.Engine SELECT 1
INFO:sqlalchemy.engine.base.Engine:SELECT 1
2023-05-04 09:37:09,667 INFO sqlalchemy.engine.base.Engine ()
INFO:sqlalchemy.engine.base.Engine:()
2023-05-04 09:37:09,668 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
INFO:sqlalchemy.engine.base.Engine:BEGIN (implicit)
2023-05-04 09:37:09,669 INFO sqlalchemy.engine.base.Engine SELECT ...
...
...
jsonify time 0.31
...
从日志跟踪来看,似乎所有真实的的SQL操作都是在query.filter
之后完成的?谢谢
1条答案
按热度按时间m528fe3b1#
SQLAlchemy方法,如
filter()
、group_by()
等。不要执行查询。它们构造一个查询对象,其中包含查询的内部表示--正在查询哪些表、要返回的列、表关系。每次调用其中一个函数(通常它们被链接起来构建所需的查询)时,它都会返回一个带有指定更改的新查询对象。直到调用返回结果的方法(如
to_dict()
)后,才会执行查询。此时,内部表示被转换为SQL,并发送到数据库。然后将结果收集到字典中。所以
.filter()
并不告诉SQLAlchemy自己过滤结果,它只是告诉SQLAlchemy在创建查询时,应该添加适当的WHERE
条件,使数据库执行所请求的过滤。