pla*_*etp 5 python postgresql warnings psycopg2
从PostgreSQL的文档上BEGIN
:
当已经在事务块内时发出BEGIN将引发警告消息.交易状态不受影响.
如何psycopg2
对任何此类警告提出异常?
我距离成为psycopg2
或Postgres
专家还很远,而且,我确信有更好的解决方案来提高警告级别,但这里有一些对我有用的东西 -一个自定义光标,用于查看连接通知,如果有的话 -它抛出异常。实现本身主要用于教育目的 - 我确信它需要进行调整才能在您的用例中工作:
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)