Python 处理Postgres服务器端错误的正确方法是什么

Python 处理Postgres服务器端错误的正确方法是什么,python,sql,postgresql,psycopg2,Python,Sql,Postgresql,Psycopg2,我正在使用psycopg2从我的Postgres服务器进行查询,这是查询的代码: def执行_查询( 自己 查询 查询参数=无, cursor\u factory=psycopg2.extras.NamedTupleCursor, ): 尝试: self.connect() 光标_id=uuid.uuid4().hex 使用self.connection.cursor( 游标标识, 游标工厂=游标工厂, )作为光标: cursor.execute( 查询 查询参数, ) 光标的屈服 最后: se

我正在使用
psycopg2
从我的Postgres服务器进行查询,这是查询的代码:

def执行_查询(
自己
查询
查询参数=无,
cursor\u factory=psycopg2.extras.NamedTupleCursor,
):
尝试:
self.connect()
光标_id=uuid.uuid4().hex
使用self.connection.cursor(
游标标识,
游标工厂=游标工厂,
)作为光标:
cursor.execute(
查询
查询参数,
)
光标的屈服
最后:
self.disconnect()
有时在没有任何服务器指示(正常CPU和RAM使用)的情况下,连接中断。 如果出现,则会引发以下异常之一:

psycopg2.OperationalError: connection pointer is NULL
psycopg2.InterfaceError: cursor already closed
我不确定处理这些特定异常的正确方法是否是重试:

def执行_查询(
自己
查询
页面大小=2000,
查询参数=无,
cursor\u factory=psycopg2.extras.NamedTupleCursor,
):
尝试:
self.connect()
光标_id=uuid.uuid4().hex
使用self.connection.cursor(
游标标识,
游标工厂=游标工厂,
)作为光标:
cursor.itersize=页面大小
cursor.execute(
查询
查询参数,
)
光标的屈服
除了(
psycopg2.0错误,
psycopg2.InterfaceError,
):
self.execute\u查询(
query=query,
页面大小=页面大小,
查询参数=查询参数,
游标工厂=游标工厂,
)
最后:
self.disconnect()
我需要知道是否有任何方法可以预测这些异常,而不必在异常已经出现之后捕获它


谢谢

根据我的经验,在两台服务器之间进行某种通信时,没有什么魔术。你无法预测这些异常何时会发生。因此,我建议首先在一切都中断时管理响应。这更多的是思维方式和一般设计建议,而不是深入研究psycopg2代码。 我将添加一些我使用的快速提示,我希望这有助于:D

跟踪您的异常情况

在使用服务器客户机应用程序时,可能会出现奇怪的结果,请记住,有大量错误您无法控制和/或预测,但这并不意味着您无法对它们进行分类并相应地升级代码。一件好事是将异常分开并逐个处理

具有未处理的异常行为

它可以是每x秒重试一次,也可以是提升它使其可见,或者重试并将回溯和异常名称存储在日志中,以便稍后对其进行分类

监视您的服务器,但不要太担心它

因为它是内部使用的,所以为了学习,尝试找出每个错误背后的原因是很好的。但是有很多不太明显的因素会干扰你的查询,比如:局域网电缆坏了,服务器中的操作系统崩溃并快速恢复,wifi连接噪音,并发性,数据库大小等等。 因此,让您的默认错误行为就位,并使您的方法在第一次尝试时表现得不完美

交易是你最好的朋友

我将开始假设您的查询属于以下两类之一:

  • DQL(数据查询语言):询问问题(选择)。这些是简单的
  • DML(数据操作语言):编辑数据(删除、更新、插入等)
(有关查询类型的更多信息,请点击以下链接:)

DML查询应始终包含在事务中,以避免出现意外错误时出现不一致:

如果您正在修改数据,而中途发生崩溃,则事务可以通过撤消未完成的内容来帮助您

我希望这能帮助你,并有一个很好的编码体验