不返回行时正确执行查询

时间:2019-11-06 10:40:43

标签: python-3.x postgresql sqlalchemy

早上好!

我有一个小脚本,试图在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.

奇怪的是,查询实际上没有问题地执行,但是当异常引发时,脚本不会停留一段时间,而是会执行10次。

有什么办法可以避免这个问题?我不知道是否可以使用fetchall ()测试以外的其他方法来建立连接,而不使用conn.execute (query) .returns_rows

非常感谢您!

1 个答案:

答案 0 :(得分:0)

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

它会尝试十次,这并不奇怪-这正是您的代码所做的。它将在 any 异常上重试,这不是一个好习惯。您应该缩小该异常处理程序的范围。

简短地重新构造您所拥有的内容,可以通过在插入物中添加RETURNING子句来解决问题。这将返回数据(您可能不需要),但是fetchall不会引发异常。这不是理想的解决方案,但是它应该修补问题,至少可以运行。