PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie würde ich die psycopg2-Protokollierung der Abfrageausführungszeit erhalten?

Einfach genug, um den Zeitstempel zu Beginn der Ausführung festzulegen und die Dauer am Ende zu berechnen. Sie benötigen Ihre eigenen einfachen Unterklassen von LoggingConnection und LoggingCursor. Siehe meinen Beispielcode.

Dies basiert auf der Quelle von MinTimeLoggingConnection, die Sie in psycopg2/extras.py finden Quelle.

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)

und Sie erhalten:

DEBUG: __main__:[query]     3 ms

innerhalb Ihres filter() Sie können die Formatierung ändern oder festlegen, dass sie nicht angezeigt werden, wenn sie unter einem bestimmten Wert liegen.