python-3.x - 当查询不返回行时正确执行查询
问题描述
早上好!
我有一个小脚本试图在 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
测试结果选择的方法以外的方法进行连接。
非常感谢您提前!
解决方案
我不确定您为什么要多次重试连接。如果您经常难以连接到数据库,那么您应该真正解决这个问题。
你不应该对它尝试十次感到惊讶——这正是你的代码所做的。它将重试任何异常,这不是一个好习惯。您应该缩小该异常处理程序的范围。
没有重新设计你所拥有的东西,你可以通过在插入中添加一个 RETURNING 子句来解决你的问题。这将返回数据(您可能不需要),但 fetchall 不会抛出异常。这不是理想的解决方案,但它应该至少可以运行。
推荐阅读
- json - 使用 WebServices 时如何捕获原始异常?
- java - 如何在 OSGi 中运行 Log4j2-Kafka-Appender
- bootstrap-4 - Bootstrap:如何在折叠导航栏上添加图标
- mysql - 数据库建模:继承
- python - 多类图像分割的多输出和损失
- java - Geotools:关于 SimpleFeatureTypeBuilder 的 length(int length) 方法
- java - Java十六进制字节数组转换为整数而不先转换为字符串
- android - updateChildren 不更新图像数组,它覆盖现有数组(url)数据 firebase android
- apache-spark - 将火花数据帧并行保存到多个目标
- reactjs - 将 ToggleClass 事件附加到 ReactJS 中的未来元素