如何在Python psycopg2中捕获特定的Postgres异常
默认的psycopg2错误消息太宽。大多数情况下,它只是抛出: psycopg2.0错误 没有任何附加信息。所以很难猜测,错误的真正原因是什么——要么是用户凭据不正确,要么就是服务器没有运行。所以,我需要一些更合适的错误处理,比如如何在Python psycopg2中捕获特定的Postgres异常,python,postgresql,Python,Postgresql,默认的psycopg2错误消息太宽。大多数情况下,它只是抛出: psycopg2.0错误 没有任何附加信息。所以很难猜测,错误的真正原因是什么——要么是用户凭据不正确,要么就是服务器没有运行。所以,我需要一些更合适的错误处理,比如pymysql库中的错误代码 我看过佩奇,但没用。当我这样做的时候 except Exception as err: print(err.pgcode) 它总是不打印。至于errorcode,它只是没有定义。我试图导入它,但失败了。所以,我需要一些帮助。任何想
pymysql
库中的错误代码
我看过佩奇,但没用。当我这样做的时候
except Exception as err:
print(err.pgcode)
它总是不打印。至于
errorcode
,它只是没有定义。我试图导入它,但失败了。所以,我需要一些帮助。任何想要快速回答的人:
简短回答
长话短说
psycopg2->erros.py
您将找到查找功能lookup(code)
sqlstate\u errors
中的psycopg2\\u psycopg\\uuu init\uuuuuuuuuuupy
,您将找到所有要作为字符串添加到查找
函数中的代码对于想要快速回答的人: 简短回答 长话短说
psycopg2->erros.py
您将找到查找功能lookup(code)
sqlstate\u errors
中的psycopg2\\u psycopg\\uuu init\uuuuuuuuuuupy
,您将找到所有要作为字符串添加到查找
函数中的代码这不是对这个问题的回答,只是我的想法,不适合评论在这种情况下,我认为在exception对象中设置
pgcode
会有帮助,但不幸的是,情况并非如此。
我正在实现一个类似于Python脚本的pg_isready
,以测试Postgres服务是否在给定的地址和端口上运行(例如,localhost
和49136
)。地址和端口可能会也可能不会被任何其他程序使用
pgu已准备好内部调用。注意的注释,这里开始了“ping”的有趣部分:确定原因…
:
/*
*这里开始了“ping”的有趣部分:确定问题的原因
*没有足够的细节来决定返回什么。我们不想要
*报告服务器未运行只是因为我们没有有效的
*例如,密码。事实上,任何类型的身份验证请求
*表示服务器已启动。(我们需要此检查,因为
*在得到一个新的连接之前,事情可能已经中断了连接
*邮政局长的错误。)
*/
如果(连接->认证请求已收到)
返回PQPING_OK;
因此,pg_isready
还使用了一个事实,即连接上的无效身份验证错误意味着连接本身已经成功,因此服务也启动了。因此,我可以按如下方式实施:
ready=True
尝试:
psycopg2.connect(
主机=地址,
端口=端口,
密码=密码,
连接超时=超时,
)
除psycopg2.1外,操作错误为ex:
就绪=(\u sendauth:no password supplied”中,除\u msg外)
但是,当捕获到异常psycopg2.OperationalError
时,ex.pgcode
为None
。因此,我不能使用错误代码来比较和查看异常是否与身份验证/授权有关。我必须检查异常是否有某条消息(正如@dhke指出的),我认为这条消息有点脆弱,因为错误消息可能会在未来的版本中更改,但我认为错误代码更改的可能性要小得多。这不是对问题的回答,只是我的想法,不适合在评论中在这种情况下,我认为在exception对象中设置pgcode
会有帮助,但不幸的是,情况并非如此。
我正在实现一个类似于Python脚本的pg_isready
,以测试Postgres服务是否在给定的地址和端口上运行(例如,localhost
和49136
)。地址和端口可能会也可能不会被任何其他程序使用
pgu已准备好内部调用。注意的注释,这里开始了“ping”的有趣部分:确定原因…
:
/*
*这里开始了“ping”的有趣部分:确定问题的原因
*没有足够的细节来决定返回什么。我们不想要
*报告服务器未运行只是因为我们没有有效的
*例如,密码。事实上,任何类型的身份验证请求
*表示服务器已启动。(我们需要此检查,因为
*在得到一个新的连接之前,事情可能已经中断了连接
*邮政局长的错误。)
*/
如果(连接->认证请求已收到)
返回PQPING_OK;
因此,pg_isready
还使用了一个事实,即连接上的无效身份验证错误意味着连接本身已经成功,因此服务也启动了。因此,我可以按如下方式实施:
ready=True
尝试:
psycopg2.connect(
主机=地址,
端口=端口,
密码=密码,
连接超时=超时,
)
除psycopg2.1外,操作错误为ex:
就绪=(\u sendauth:no password supplied”中,除\u msg外)
但是,当捕获到异常psycopg2.OperationalError
时,ex.pgcode
为None
。因此,我不能使用错误代码来比较和查看异常是否与身份验证/授权有关。我必须检查异常是否有某条消息(正如@dhke指出的),我认为这条消息有点脆弱,因为错误消息
import traceback # Just to show the full traceback
from psycopg2 import errors
InFailedSqlTransaction = errors.lookup('25P02')
try:
feed = self._create_feed(data)
except InFailedSqlTransaction:
traceback.print_exc()
self._cr.rollback()
pass # Continue / throw ...