Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python psycopg2中捕获特定的Postgres异常_Python_Postgresql - Fatal编程技术网

如何在Python psycopg2中捕获特定的Postgres异常

如何在Python psycopg2中捕获特定的Postgres异常,python,postgresql,Python,Postgresql,默认的psycopg2错误消息太宽。大多数情况下,它只是抛出: psycopg2.0错误 没有任何附加信息。所以很难猜测,错误的真正原因是什么——要么是用户凭据不正确,要么就是服务器没有运行。所以,我需要一些更合适的错误处理,比如pymysql库中的错误代码 我看过佩奇,但没用。当我这样做的时候 except Exception as err: print(err.pgcode) 它总是不打印。至于errorcode,它只是没有定义。我试图导入它,但失败了。所以,我需要一些帮助。任何想

默认的psycopg2错误消息太宽。大多数情况下,它只是抛出:

psycopg2.0错误

没有任何附加信息。所以很难猜测,错误的真正原因是什么——要么是用户凭据不正确,要么就是服务器没有运行。所以,我需要一些更合适的错误处理,比如
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 ...