我搜索了互联网,没有找到一个非常简单问题的答案。
我有一个简单的 Web 应用程序(由 web.py 提供支持),它使用 SQLAlchemy 0.7.8 + psycopg2,所以 sqltap 对我不起作用。因此,我可以在引擎中启用 echo=True 或对保存在 threadlocal 中的当前会话执行任何操作。
计算查询数量及其执行时间的正确方法是什么?使用某种事件并增加一些全局变量?我几乎确信 SQLAlchemy 可以自己完成它,但在文档中没有找到任何关于它的行。
可以使用 SQLAlchemy 的事件系统跟踪查询数量。具体来说,可以连接到
engine.events.before_cursor_execute
事件,该事件在每次执行 SQL 语句之前触发。
以下是如何执行此操作的示例:
from sqlalchemy import create_engine, event
engine = create_engine("postgresql://user:password@host:port/database")
@event.listens_for(engine, 'before_cursor_execute')
def before_cursor_execute(conn, cursor, statement, parameters, context, executemany):
# 增加全局计数器或线程本地计数器
global query_count
query_count += 1
# 可以选择打印查询及其参数以进行调试
print("SQL Query:", statement)
print("Parameters:", parameters)
# 在此处放置 SQLAlchemy 代码
# ...
# 在处理完请求后打印或记录 query_count
print(f"请求期间执行了 {query_count} 个查询。")
此代码执行以下操作:
-
它定义了一个名为
before_cursor_execute
的函数,该函数接受六个参数。这些参数由 SQLAlchemy 事件系统提供,并且包含有关正在执行的查询的信息。 -
@event.listens_for
装饰器将before_cursor_execute
函数连接到engine.events.before_cursor_execute
事件。这意味着每次引擎执行查询之前,都会调用此函数。 -
在
before_cursor_execute
函数内部,全局变量query_count
增加 1。可以将其替换为喜欢的任何计数机制,例如线程本地存储以进行每个请求的计数。 - 该代码还可选地打印正在执行的 SQL 查询及其参数。这对于调试很有用。
重要说明:
- 确保在创建 SQLAlchemy 引擎后和执行任何查询之前连接到事件。
- 如果的应用程序使用多个线程或进程,则使用线程本地存储或其他机制来单独跟踪每个线程或进程的查询计数非常重要。
使用此方法,可以跟踪应用程序执行的 SQL 查询数量,这有助于识别性能瓶颈并优化数据库访问代码。
标签:python,postgresql,sqlalchemy,profiling From: 22559276