xmr*_*mrG 5 python postgresql psycopg2 pgadmin
我正在使用psycopg2,并且在将事件(执行的查询,通知,错误)记录到文件时遇到问题。我想在PgAdmin历史记录窗口中获得效果。
例如,我正在执行以下查询:
insert into city(id, name, countrycode, district, population) values (4080,'Savilla', 'ESP', 'andalucia', 1000000)
Run Code Online (Sandbox Code Playgroud)
在PgAdmin中,我看到这样的效果:
Executing query:
insert into city(id, name, countrycode, district, population) values (4080,'Sevilla', 'ESP', 'andalucia', 1000000)
Query executed in 26 ms.
One row affected.
Run Code Online (Sandbox Code Playgroud)
使用psycopg2可以获得类似的效果吗?
我尝试使用LoggingCursor,但对我来说并不令人满意,因为它仅记录查询。
感谢帮助。
编辑:
我的代码:
conn = psycopg2.extras.LoggingConnection(DSN)
File=open('log.log','a')
File.write('================================')
psycopg2.extras.LoggingConnection.initialize(conn,File)
File.write('\n'+time.strftime("%Y-%m-%d %H:%M:%S") + '---Executing query:\n\t')
q="""insert into city(id, name, countrycode, district, population) values (4080,'Sevilla', 'ESP', 'andalucia', 10000)"""
c=conn.cursor()
c.execute(q)
File.write('\n'+time.strftime("%Y-%m-%d %H:%M:%S") + '---Executing query:\n\t')
q="""delete from city where id = 4080"""
c=conn.cursor()
c.execute(q)
conn.commit()
File.close()
Run Code Online (Sandbox Code Playgroud)
这是我的输出日志:
================================
2012-12-30 22:42:31---Executing query:
insert into city(id, name, countrycode, district, population) values (4080,'Sevilla', 'ESP', 'andalucia', 10000)
2012-12-30 22:42:31---Executing query:
delete from city where id = 4080
Run Code Online (Sandbox Code Playgroud)
我想在日志文件中查看有关受影响的行数和错误信息的信息。最后,我想拥有一个包含所有事件的完整日志文件。
据我所知,LoggingCursor 类未满足您的三个要求
对于第一个要求,请查看psycopg2.extras 中MinTimeLoggingConnection类的源代码。它是 LoggingConnection 的子类,并输出超过最小时间的查询的执行时间(注意,这需要与 MinTimeLoggingCursor 结合使用)。
对于第二个要求,游标类的rowcount 属性指定
最后一次执行 *() 生成的行数(对于 SELECT 之类的 DQL 语句)或受影响的行数(对于 UPDATE 或 INSERT 之类的 DML 语句)
因此,应该可以创建您自己的包含此附加功能的 LoggingConnection 和 LoggingCursor 类型。
我的尝试如下。只需在代码中替换LoggingConnection为,这应该就可以了。LoggingConnection2作为旁注,您不需要为第二个查询创建新游标。您可以c.execute(q)在定义第二个查询后再次调用。
import psycopg2
import os
import time
from psycopg2.extras import LoggingConnection
from psycopg2.extras import LoggingCursor
class LoggingConnection2(psycopg2.extras.LoggingConnection):
def initialize(self, logobj):
LoggingConnection.initialize(self, logobj)
def filter(self, msg, curs):
t = (time.time() - curs.timestamp) * 1000
return msg + os.linesep + 'Query executed in: {0:.2f} ms. {1} row(s) affected.'.format(t, curs.rowcount)
def cursor(self, *args, **kwargs):
kwargs.setdefault('cursor_factory', LoggingCursor2)
return super(LoggingConnection, self).cursor(*args, **kwargs)
class LoggingCursor2(psycopg2.extras.LoggingCursor):
def execute(self, query, vars=None):
self.timestamp = time.time()
return LoggingCursor.execute(self, query, vars)
def callproc(self, procname, vars=None):
self.timestamp = time.time()
return LoggingCursor.execute(self, procname, vars)
Run Code Online (Sandbox Code Playgroud)
我不确定如何创建所有事件的完整日志,但连接类的通知属性可能令人感兴趣。