如何在psycopg2中向异常提升PostgreSQL警告?

pla*_*etp 5 python postgresql warnings psycopg2

从PostgreSQL的文档BEGIN:

当已经在事务块内时发出BEGIN将引发警告消息.交易状态不受影响.

如何psycopg2对任何此类警告提出异常?

ale*_*cxe 3

我距离成为psycopg2Postgres专家还很远,而且,我确信有更好的解决方案来提高警告级别,但这里有一些对我有用的东西 -一个自定义光标,用于查看连接通知,如果有的话 -它抛出异常。实现本身主要用于教育目的 - 我确信它需要进行调整才能在您的用例中工作:

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
Run Code Online (Sandbox Code Playgroud)

使用示例:

conn = psycopg2.connect(user="user", password="secret")
cursor = conn.cursor(conn, cursor_factory=ErrorThrowingCursor)
Run Code Online (Sandbox Code Playgroud)

psycopg2.Warning如果在查询执行后发出警告,这将引发(某种类型的)异常。样本:

psycopg2.Warning: there is already a transaction in progress
Run Code Online (Sandbox Code Playgroud)