sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur skulle jag få psycopg2-loggning av frågekörningstiden?

Lätt nog att ställa in tidsstämpel vid start av exekvering och beräkna varaktighet vid slutet. Du behöver dina egna enkla underklasser av LoggingConnection och LoggingCursor. Se min exempelkod.

Detta är baserat på källan till MinTimeLoggingConnection som du kan hitta i psycopg2/extras.py källa.

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)

och du får:

DEBUG: __main__:[query]     3 ms

i ditt filter() du kan ändra formateringen, eller välja att inte visa, om det är mindre än ett värde.




  1. Hur tar man bort alla icke-alfanumeriska tecken från en sträng i MySQL?

  2. SQL-fråga för att sammanfoga kolumnvärden från flera rader i Oracle

  3. ORA-00838

  4. Funktion i SQL Server 2008 som liknar GREATEST i mysql?