sql >> データベース >  >> RDS >> PostgreSQL

クエリ実行時間のpsycopg2ログを取得するにはどうすればよいですか?

    実行開始時にタイムスタンプを設定し、終了時に期間を計算するのに十分簡単です。 LoggingConnectionとLoggingCursorの独自の単純なサブクラスが必要になります。私のサンプルコードを参照してください。

    これは、psycopg2/extras.pyにあるMinTimeLoggingConnectionのソースに基づいています。 ソース。

    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)
    

    そして、あなたは得るでしょう:

    DEBUG: __main__:[query]     3 ms
    

    filter()内 書式を変更するか、値が小さい場合は表示しないように選択できます。




    1. docker-composeupの後にPostgresダンプをロードします

    2. T-SQLステートメントのプレフィックスNの意味は何ですか?いつ使用する必要がありますか?

    3. PLSQL Anonymousブロックが完了したときに出力がないのはなぜですか?

    4. テーブルの行を数える