不返回行时正确执行查询

早上好!

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

非常感谢您!

super__1987cl 回答:不返回行时正确执行查询

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

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

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

本文链接:https://www.f2er.com/3152997.html

大家都在问