2016-07-06 58 views

回答

2

我被psycopg2Postgres专家很远,而且,我相信有一个更好的解决方案,以提高警告级别,但在这里是一种适合我的工作 - a custom cursor看起来到connection notices,如果有有些东西 - 它会抛出一个异常。实施本身是教育的目的主要是 - 我相信这需要调整您的使用情况下的工作:

import psycopg2 

# this "cursor" class needs to be used as a base for custom cursor classes 
from psycopg2.extensions import cursor 

class ErrorThrowingCursor(cursor): 
    def __init__(self, conn, *args, **kwargs): 
     self.conn = conn 
     super(ErrorThrowingCursor, self).__init__(*args, **kwargs) 

    def execute(self, query, vars=None): 
     result = super(ErrorThrowingCursor, self).execute(query, vars) 

     for notice in self.conn.notices: 
      level, message = notice.split(": ") 
      if level == "WARNING": 
       raise psycopg2.Warning(message.strip()) 

     return result 

用法示例:

conn = psycopg2.connect(user="user", password="secret") 
cursor = conn.cursor(conn, cursor_factory=ErrorThrowingCursor) 

这将抛出一个异常(一个psycopg2.Warning的如果在查询执行后发出警告,则键入)。示例:

psycopg2.Warning: there is already a transaction in progress 
+0

这看起来很干净。如果'psycopg'支持这样的游标,那么我们会很高兴。 – planetp