首页 > 编程问答 >如何确定SQLAlchemy在用户请求期间执行的查询数量?

如何确定SQLAlchemy在用户请求期间执行的查询数量?

时间:2024-07-20 21:48:16浏览次数:13  
标签:python postgresql sqlalchemy profiling

我搜索了互联网,没有找到一个非常简单问题的答案。

我有一个简单的 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

相关文章

  • 我在 python 项目中不断收到“无法识别图像文件中的数据”错误
    我正在尝试向我的TK窗口添加一个图标,但我不断收到一条错误消息:Traceback(mostrecentcalllast):File"C:\Users\roger\source\repos\PythonApplication\PythonApplication.py",line7,in<module>windowIcon=tk.PhotoImage(file="C:/Users/roger/Downloa......
  • Python学习笔记41:游戏篇之外星人入侵(二)
    前言在上一篇文章,我们已经创建好了项目目录,在今天,我们主要编写入口模块的功能。mainmain.py模块是我们游戏程序的入口,所有我们需要在模块中编写游戏主启动以及主页面相关的代码。当前我们的main模块是这样的,这是我们创建项目时默认生成一些代码,接下来我们就要进行我们......
  • Python学习笔记39:进阶篇(二十八)pygame的使用之按键映射及按键失效问题解决
    前言基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。我们的下一步目标是完成pythoncrashcourse中的外星人入侵项目,这是一个2D游戏项目。在这之前,我们先简单学习一下pygame模块。私信我发送消息python资料,......
  • Python学习笔记40:游戏篇之外星人入侵(一)
    前言入门知识已经学完,常用标准库也了解了,pygame入门知识也学了,那么开始尝试小游戏的开发。当然这个小游戏属于比较简单的小游戏,复杂的游戏需要长时间的编写累计开发经验,同时也需要一定的时间才能编写出来。现在的话还是嫩了点。从基础的简单的开始,学习实践,慢慢的成长才......
  • Python学习笔记37:进阶篇(二十六)pygame的使用之输入处理
    前言基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。我们的下一步目标是完成pythoncrashcourse中的外星人入侵项目,这是一个2D游戏项目。在这之前,我们先简单学习一下pygame模块。私信我发送消息python资料,......
  • Python学习笔记38:进阶篇(二十七)pygame的使用之时间与帧数控制
    前言基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。我们的下一步目标是完成pythoncrashcourse中的外星人入侵项目,这是一个2D游戏项目。在这之前,我们先简单学习一下pygame模块。私信我发送消息python资料,......
  • 音频文件降噪及python示例
    操作系统:Windows10_x64Python版本:3.9.2noisereduce版本:3.0.2从事音频相关工作,大概率会碰到降噪问题,今天整理下之前学习音频文件降噪的笔记,并提供Audacity和python示例。我将从以下几个方面展开:noisereduce库介绍使用Audacity进行降噪使用fft滤波降噪使用noisereduce进......
  • Python; Django 添加字符到路径名导致操作系统错误 22
    我一直在尝试让django渲染我创建的模板。起初它说模板不存在,但是一旦我修复了错误,它现在就会向路径添加字符,并且因此找不到模板。路径应该是:C:\\Users\\ABC\\Desktop\\science_crowd\\Lightweight_Django\\placeholder\\home.html但是错误说:它找不到:C:\\Us......
  • 如何在 IPython 控制台中显示 conda 环境名称?
    上下文我想在Spyder的IPython控制台中显示conda环境名称,这样我就知道我正在运行哪个环境。虽然此信息在状态栏中可用,但有时只是显示|||而不是实际的环境名称:conda我尝试过的在启动时打印它Spyder允许在控制台启动时运行代码。但是,似乎......
  • Python 中更快的套接字
    我有一个用Python编写的服务器客户端,它通过LAN运行。该算法的某些部分密集使用套接字读取,其执行速度比用C++编写的几乎相同的慢3-6倍。有哪些解决方案可以使Python套接字读取速度更快?我实现了一些简单的缓冲,我的用于处理套接字的类如下所示:P.S.:分析还显示......