sql >> Databáze >  >> RDS >> PostgreSQL

Jak získám protokolování psycopg2 doby provádění dotazu?

Dost snadné nastavit časové razítko na začátku provádění a vypočítat dobu trvání na konci. Budete potřebovat své vlastní jednoduché podtřídy LoggingConnection a LoggingCursor. Viz můj příklad kódu.

Toto je založeno na zdroji MinTimeLoggingConnection, který najdete v psycopg2/extras.py zdroj.

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)

a dostanete:

DEBUG: __main__:[query]     3 ms

ve vašem filter() můžete změnit formátování nebo zvolit nezobrazovat, pokud je menší než nějaká hodnota.




  1. Jak flexibilní/omezující jsou typy sloupců SQLite?

  2. Chyba 1046 Není vybrána žádná databáze, jak vyřešit?

  3. Představujeme novou funkci – Zpráva o růstu databáze Spotlight Cloud

  4. ORA-20001 v R12 Shromáždit statistiky schématu na 11g (FND_HISTOGRAM_COLS)