首页 > 解决方案 > 当查询不返回行时正确执行查询

问题描述

早上好!

我有一个小脚本试图在 postgres 表上执行插入操作。

我负责连接数据库的程序如下:

def conecta_server(lista, names):

    PUERTO      = 5432
    success     = False
    retries     = 0
    max_retries = 10

    while not success and retries < max_retries:

        try:
            with SSHTunnelForwarder((REMOTE_SERVER, 22),
                                ssh_username             = "user",
                                ssh_pkey                 = ssh_pkey,
                                ssh_private_key_password = "",
                                remote_bind_address      = ('127.0.0.1', PUERTO),
                                local_bind_address       = ('', PUERTO)) as tunnel:

                engine = sqlalchemy.create_engine("postgresql+psycopg2://{user}:{passw}@{host}:{port}/{db}".format(
                        user  = 'user',
                        passw = 'pass',
                        host  = tunnel.local_bind_host,
                        port  = tunnel.local_bind_port,
                        db    = 'db'))

                with engine.connect() as conn:
                        dic_df = {name: pd.DataFrame(conn.execute(query).fetchall(), columns = conn.execute(query).keys()) for (query, name) in zip(lista, names)}

            return dic_df

        except Exception as e:
            print('Error al intentarlo...')
            print(e)

        retries += 1

我通常将此代码用于选择操作,但正如我所说,现在我需要进行插入。

当我这样做时,会发生以下错误:

*** sqlalchemy.exc.ResourceClosedError: This result object does not return rows. It has been closed automatically.

奇怪的是,查询确实执行没有问题,但是当异常引发时,脚本并没有离开 while,而是执行了 10 次。

有没有办法避免这个问题?我不知道是否可以使用fetchall ()之前根据conn.execute (query) .returns_rows测试结果选择的方法以外的方法进行连接。

非常感谢您提前!

标签: python-3.xpostgresqlsqlalchemy

解决方案


我不确定您为什么要多次重试连接。如果您经常难以连接到数据库,那么您应该真正解决这个问题。

你不应该对它尝试十次感到惊讶——这正是你的代码所做的。它将重试任何异常,这不是一个好习惯。您应该缩小该异常处理程序的范围。

没有重新设计你所拥有的东西,你可以通过在插入中添加一个 RETURNING 子句来解决你的问题。这将返回数据(您可能不需要),但 fetchall 不会抛出异常。这不是理想的解决方案,但它应该至少可以运行。


推荐阅读