首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何获得查询执行时间的psycopg2日志记录?

如何获得查询执行时间的psycopg2日志记录?
EN

Stack Overflow用户
提问于 2015-09-19 05:43:35
回答 1查看 6.4K关注 0票数 8

我正在尝试获取psycopg2执行的查询的性能统计信息,但是文档/示例看起来仍然很模糊,也不够清晰。

我至少已经通过记录器进行了调试。要访问查询的性能数据,我需要做些什么?我想要得到查询执行时间的数字。

是否有我可以访问的方法,或者需要初始化以输出查询执行时间的其他方法?

以下是我到目前为止的拼凑摘录:

代码语言:javascript
复制
import psycopg2
import psycopg2.extensions
from psycopg2.extras import LoggingConnection
import logging

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)

# set higher up in script
db_settings = {
    "user": user,
    "password": password,
    "host": host,
    "database": dbname,
}

query_txt = "[query_txt_from file]"

conn = psycopg2.connect(connection_factory=LoggingConnection, **db_settings)
conn.initialize(logger)

cur = conn.cursor()
cur.execute(query_txt)

我得到了

代码语言:javascript
复制
DEBUG:__main__: [the query executed]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-04 07:51:45

很容易在执行开始时设置时间戳,并在结束时计算持续时间。您需要自己的简单子类LoggingConnection和LoggingCursor。请参阅我的示例代码。

这是基于您可以在psycopg2/extras.py源代码中找到的MinTimeLoggingConnection源代码。

代码语言:javascript
复制
import time
import psycopg2
import psycopg2.extensions
from psycopg2.extras import LoggingConnection, LoggingCursor
import logging

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)

# MyLoggingCursor simply sets self.timestamp at start of each query                                                                 
class MyLoggingCursor(LoggingCursor):
    def execute(self, query, vars=None):
        self.timestamp = time.time()
        return super(MyLoggingCursor, self).execute(query, vars)

    def callproc(self, procname, vars=None):
        self.timestamp = time.time()
        return super(MyLoggingCursor, self).callproc(procname, vars)

# MyLogging Connection:                                                                                                             
#   a) calls MyLoggingCursor rather than the default                                                                                
#   b) adds resulting execution (+ transport) time via filter()                                                                     
class MyLoggingConnection(LoggingConnection):
    def filter(self, msg, curs):
        return msg + "   %d ms" % int((time.time() - curs.timestamp) * 1000)

    def cursor(self, *args, **kwargs):
        kwargs.setdefault('cursor_factory', MyLoggingCursor)
        return LoggingConnection.cursor(self, *args, **kwargs)

db_settings = {
    ....
}

query_txt = "[query_text_from file]"

conn = psycopg2.connect(connection_factory=MyLoggingConnection, **db_settings)
conn.initialize(logger)

cur = conn.cursor()
cur.execute(query_text)

然后你就会得到:

代码语言:javascript
复制
DEBUG: __main__:[query]     3 ms

filter()中,您可以更改格式,如果小于某个值,也可以选择不显示。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32661495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档