6

我正在通过 SQLAlchemy 库使用一个相当大的 MySQL 数据库,我很想关闭 MySQL 的查询缓存以在每个会话的基础上调试性能问题。当重复它们导致更快的执行时,很难调试慢查询。使用 CLI MySQL 客户端,我可以执行SET SESSION query_cache_type = OFF;以实现我正在寻找的结果,并且我想在每个 SQLAlchemy 会话上运行它(当我调试时)。

但我不知道如何配置 SQLAlchemy,使其SET SESSION query_cache_type = OFF在实例化新数据库会话时运行。

我查看了引擎和连接文档,但似乎找不到任何东西。

有什么明显的我遗漏的东西,或者更好的方法吗?

4

1 回答 1

6

定义引擎后立即使用事件挂钩:

from sqlalchemy import event

def disable_query_cache(conn, record):
    conn.cursor().execute("SET SESSION query_cache_type = OFF")


# this is probably in your Pyramid setup code
engine = create_engine(...)

if DEBUGGING:
    event.listen(engine, 'connect', disable_query_cache)

您可以通过将钩子添加到Pool类本身来全局执行此操作,但是(a)您可能希望 Pyramid 设置可用,以便您可以决定是否添加钩子,并且(b)全局状态不好:)

于 2013-01-17T05:59:18.017 回答