PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak uzyskać rejestrowanie czasu wykonania zapytania przez psycopg2?

Wystarczająco łatwe, aby ustawić znacznik czasu na początku wykonania i obliczyć czas trwania na końcu. Będziesz potrzebować własnych prostych podklas LoggingConnection i LoggingCursor. Zobacz mój przykładowy kod.

Jest to oparte na źródle MinTimeLoggingConnection, które można znaleźć w psycopg2/extras.py źródło.

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 dostaniesz:

DEBUG: __main__:[query]     3 ms

w twoim filter() możesz zmienić formatowanie lub nie wyświetlać, jeśli wartość jest mniejsza niż pewna.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak EDB stał się liderem na rynku Postgres

  2. Programowo generuj DDL w Postgresql

  3. Railsy:Błąd podczas instalacji pg gem

  4. Transakcje nie działają dla mojej bazy danych MySQL

  5. Jak używać RETURNING z ON CONFLICT w PostgreSQL?