mysql 了解SQLAlchemy查询的底层内容及其延迟

jyztefdp  于 2023-05-05  发布在  Mysql
关注(0)|答案(1)|浏览(132)

下面是我使用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之后完成的?谢谢

m528fe3b

m528fe3b1#

SQLAlchemy方法,如filter()group_by()等。不要执行查询。它们构造一个查询对象,其中包含查询的内部表示--正在查询哪些表、要返回的列、表关系。每次调用其中一个函数(通常它们被链接起来构建所需的查询)时,它都会返回一个带有指定更改的新查询对象。
直到调用返回结果的方法(如to_dict())后,才会执行查询。此时,内部表示被转换为SQL,并发送到数据库。然后将结果收集到字典中。
所以.filter()并不告诉SQLAlchemy自己过滤结果,它只是告诉SQLAlchemy在创建查询时,应该添加适当的WHERE条件,使数据库执行所请求的过滤。

相关问题