【问题标题】:What is the proper way to handle Postgres server side errors处理 Postgres 服务器端错误的正确方法是什么
【发布时间】:2021-07-02 07:09:26
【问题描述】:

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

def execute_query(
        self,
        query,
        query_params=None,
        cursor_factory=psycopg2.extras.NamedTupleCursor,
    ):
        try:
            self.connect()
            cursor_id = uuid.uuid4().hex

            with self.connection.cursor(
                cursor_id,
                cursor_factory=cursor_factory,
            ) as cursor:
                cursor.execute(
                    query,
                    query_params,
                )

                yield from cursor
        finally:
            self.disconnect()

有时在没有任何服务器指示(正常 CPU 和 RAM 使用)的情况下,连接会中断。 当它发生时,它会引发以下异常之一:

psycopg2.OperationalError: connection pointer is NULL
psycopg2.InterfaceError: cursor already closed

我不确定处理这些特定异常的正确方法是否是重试:

    def execute_query(
        self,
        query,
        page_size=2000,
        query_params=None,
        cursor_factory=psycopg2.extras.NamedTupleCursor,
    ):
        try:
            self.connect()
            cursor_id = uuid.uuid4().hex

            with self.connection.cursor(
                cursor_id,
                cursor_factory=cursor_factory,
            ) as cursor:
                cursor.itersize = page_size
                cursor.execute(
                    query,
                    query_params,
                )

                yield from cursor
        except (
            psycopg2.OperationalError,
            psycopg2.InterfaceError,
        ):
            self.execute_query(
                query=query,
                page_size=page_size,
                query_params=query_params,
                cursor_factory=cursor_factory,
            )
        finally:
            self.disconnect()

我需要知道是否有任何方法可以预测这些异常而不在它已经引发后捕获它

谢谢!

【问题讨论】:

    标签: python sql postgresql psycopg2


    【解决方案1】:

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

    跟踪您的异常情况

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

    存在未处理的异常行为

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

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

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

    交易是你最好的朋友

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

    • DQL(数据查询语言):询问事物(SELECT)。这些都是简单的
    • DML(数据操作语言):编辑数据(删除、更新、插入...)

    (有关查询类型的更多信息,我给你这个链接:https://www.geeksforgeeks.org/sql-ddl-dql-dml-dcl-tcl-commands/

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

    如果您正在修改数据并且中途发生崩溃,事务可以通过撤消未完成的操作来帮助您。

    我希望这对您有所帮助,并有一个愉快的编码体验!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      • 2020-12-02
      • 2017-09-20
      相关资源
      最近更新 更多