早上好!
我有一个小脚本,试图在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
。
非常感谢您!
答案 0 :(得分:0)
我不确定为什么您要重试连接很多次。如果您经常遇到连接数据库的困难,那么您应该真正解决该问题。
它会尝试十次,这并不奇怪-这正是您的代码所做的。它将在 any 异常上重试,这不是一个好习惯。您应该缩小该异常处理程序的范围。
简短地重新构造您所拥有的内容,可以通过在插入物中添加RETURNING子句来解决问题。这将返回数据(您可能不需要),但是fetchall不会引发异常。这不是理想的解决方案,但是它应该修补问题,至少可以运行。