我们一直在试验sqlalchemy的断开连接处理,以及它如何与ORM集成.我们已经研究了文档,建议似乎是捕获断开连接异常,发出rollback(),然后重试代码.

如:

import sqlalchemy as SA

retry = 2
while retry:
    retry -= 1
    try:
        for name in session.query(Names):
            print name
        break
    except SA.exc.DBAPIError as exc:
        if retry and exc.connection_invalidated:
            session.rollback()
        else:
            raise

我遵循的基本原理是——您必须回滚所有活动事务并重播它们,以确保操作的顺序一致.

但是——这意味着要 for each 想要处理数据的函数添加大量额外的代码.此外,在SELECT的情况下,我们没有修改数据,回滚/重新请求的概念不仅难看,而且违反了DRY原则(不要重复).

我想知道其他人是否介意分享他们如何处理sqlalchemy的断开连接.

仅供参考:我们正在使用sqlalchemy 0.9.8和Postgres 9.2.9

推荐答案

我喜欢的方法是将所有数据库代码放在lambda或闭包中,并将其传递到一个助手函数中,该函数将处理捕获断开连接异常并重试.

以你的例子来说:

import sqlalchemy as SA

def main():
    def query():
        for name in session.query(Names):
            print name

    run_query(query)

def run_query(f, attempts=2):
    while attempts > 0:
        attempts -= 1
        try:
            return f() # "break" if query was successful and return any results
         except SA.exc.DBAPIError as exc:
            if attempts > 0 and exc.connection_invalidated:
                session.rollback()
            else:
                raise

您可以通过将布尔值传递到run_query来处理这种情况,即您只进行读取,因此希望在不回滚的情况下重试.

这有助于满足DRY原则,因为用于管理重试和回滚的所有丑陋的锅炉板代码都放在一个位置.

Postgresql相关问答推荐

利用PostgreSQL查询中表的顺序来计算包含每次时间的时间范围

如何获取实例化视图的列级权限?

是否可以在psql查询输出中删除新行末尾的+号?

如何使用 go-pg 包删除所有记录

EF Core和npgsql连接池已被耗尽

使用Helm设置PostgreSQL配置

使用 WHERE 子句创建递归视图

ST_Intersects 太慢

AWS RDS Postgres 性能缓慢的数据传输

如何使 Postgres 优化引擎具有确定性

如何展平也在关系中使用的区分大小写的列

psql中set、\set和\pset的区别

升级到 OSX Mavericks 后修复 postgresql

获取带有时区偏移的日期

错误:syntax error at or near "user"

在 PostgreSQL 中将时间转换为秒

带有双引号的 postgresql COPY 和 CSV 数据

Psycopg2 使用占位符插入表格

PostgreSQL 中的行编号

Entity Framework Core jsonb 列类型