【发布时间】:2015-07-28 23:53:55
【问题描述】:
所以当我在 Query 对象上调用 list() 时,我得到了这个结果,它执行查询并将结果作为列表返回。
我想知道的是源代码中究竟发生了什么使 Query 触发 SQL 并获取结果。
【问题讨论】:
-
可能想要启用日志记录(如 here 所示)并查看调用 list 时实际执行的查询。
标签: python mysql sql sqlalchemy
所以当我在 Query 对象上调用 list() 时,我得到了这个结果,它执行查询并将结果作为列表返回。
我想知道的是源代码中究竟发生了什么使 Query 触发 SQL 并获取结果。
【问题讨论】:
标签: python mysql sql sqlalchemy
你什么时候list(query),python调用方法__iter__(),对于任何容器,对于类Query。
该方法初始化上下文并最终调用_execute_and_instances(),以及类Query的内部方法,从会话中获取连接并执行查询语句。
def _execute_and_instances(self, querycontext):
conn = self._connection_from_session(
mapper=self._mapper_zero_or_none(),
clause=querycontext.statement,
close_with_result=True)
result = conn.execute(querycontext.statement, self._params)
return loading.instances(self, result, querycontext)
所以查询会在 list 对象创建时执行。
这不是很详细,我希望它足以回答你的问题。也许关于你为什么要问的一些背景信息可以让我们进入更多相关的细节。无论如何,希望它有所帮助。
编辑:在通过 cmets 进行澄清后,至于您的第二个问题(即如何在查询中添加您的呼叫回溯作为评论,以登录服务器):我不单点修改是不可行的。
大多数查询都通过对象Query,其方法_compile_context是查询组合的共同点。如果您启动常规查询(带有过滤器等的选择)或删除,它将通过此方法。
但是,session.add 完全不同。在添加对象的那一刻,实际上并没有做太多事情(关于我的意思是查询;当然,新对象已注册)。仅当您执行 commit 时才插入对象(如预期的那样)。 session.flush 开始这个过程。此时,您可以使用SQLAlchemy 的mapper,并且可以获得您实际添加的对象的实例(例如,您的类User 的实例)。如果您在创建实例时添加了回溯,则可以在此处恢复它并将其作为注释添加到查询中。
无论如何,这根本不容易,也难以维护,而它只是用于调试。我理解你想要做什么,但是对于一个不太好的结果来说太费力了(在我看来)。
【讨论】:
session.add 组成了一个查询(我不知道它是否只是在调用时才这样做,我必须检查它),但是直到commit 才将该查询发送到服务器。与select 相同,您首先编写查询,但它实际上是在您需要数据时发送的。我认为您正在寻找的共同点,如果您想要实际发送查询的点,它是connection.execute。
SQLAlchemy 确实有很多日志记录(@TJ1S 已经提供了链接)。
session.add 被调用时。我想让评论显示在实际查询中,以便将其记录在 MySQL 常规日志中。注释基本上应该只是回溯的第一行,说明查询来自哪个文件和哪一行。
connection.execute。您可以在 Query 对象中的某个位置执行此操作。让我看看,如果我找到什么,我会回复你。 (请耐心等待,我的时区有点晚,可能会留到明天。)