【发布时间】:2019-10-21 18:12:23
【问题描述】:
我在 python 代码中通过 ODBC 连接连接到 DB2 服务器。 DB2 服务器为了维护而重新启动或在运行特定的服务器端任务时断开我的连接,一天发生 1 或 2 次。那时,如果我的代码已经开始执行 pandas read_sql 函数来获取查询结果,那么即使服务器在 1 小时后启动,它也会进入无限等待。
我想在 read_sql 的执行中设置一个超时,并且无论何时发生超时,我都想刷新与 DB2 服务器的连接,以便在继续查询之前再次建立新的连接。
我尝试过创建一个 while 循环并从 DB2 中挑选数据块,而不是一次提取整个结果,但问题是如果 DB2 在提取块 python 代码时断开连接仍然会进入无限等待。
chunk_size = 1000
offset = 0
while True:
sql = "SELECT * FROM table_name limit %d offset %d" % (chunk_size,offset)
df = pd.read_sql(sql, conn)
df.index += (offset+1)
offset += chunk_size
sys.stdout.write('.')
sys.stdout.flush()
if df.shape[0] < chunk_size:
break
如果 sql 执行时间超过 3 分钟,我需要 read_sql 抛出一些异常或返回一个值。如果发生这种情况,我需要刷新与 DB2 的连接。
【问题讨论】:
-
你找到合适的方法了吗?
-
@ChaminWickramarathna 我不确定这是否是最好的方法,但下面标记的解决方案在许多其他情况下对我来说也很方便,包括这个。
-
pandas read_sql_query 的默认内部超时是多少?如果有人知道吗?我的目标是内部超时的可选参数,如果提供,则将其覆盖,否则保持默认值。
标签: python-3.x pandas sqlalchemy odbc pyodbc