PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana saya mendapatkan psycopg2 logging dari waktu eksekusi kueri?

Cukup mudah untuk mengatur stempel waktu di awal eksekusi dan menghitung durasi di akhir. Anda memerlukan subkelas LoggingConnection dan LoggingCursor sederhana Anda sendiri. Lihat kode contoh saya.

Ini didasarkan pada sumber MinTimeLoggingConnection yang dapat Anda temukan di psycopg2/extras.py sumber.

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)

dan Anda akan mendapatkan:

DEBUG: __main__:[query]     3 ms

dalam filter() . Anda Anda dapat mengubah pemformatan, atau memilih untuk tidak menampilkan, jika kurang dari nilai tertentu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mengapa PG::UniqueViolation:ERROR:nilai kunci duplikat melanggar batasan unik?

  2. Bagaimana age() Bekerja di PostgreSQL

  3. Cara Membuat Daftar Database dan Tabel di PostgreSQL

  4. Bagaimana cara membuat profil Database PostgreSQL?

  5. Apa perilaku yang diharapkan untuk beberapa fungsi pengembalian set dalam klausa SELECT?