【问题标题】:Is there any way to put timeout in pandas read_sql function?有没有办法在 pandas read_sql 函数中设置超时?
【发布时间】: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


【解决方案1】:

您可以使用包func-timeout。您可以通过 pip 安装如下:

pip install func-timeout

因此,例如,如果您想要限制运行 5 秒的函数“doit('arg1','arg2')”,则可以使用 func_timeout 调用它:

from func_timeout import func_timeout, FunctionTimedOut

try:
  doitReturnValue = func_timeout(5, doit, args=(‘arg1’, ‘arg2’))
except FunctionTimedOut:
  print ( “doit(‘arg1’, ‘arg2’) could not complete within 5 seconds, hence terminated.\n”)
except Exception as e:
  # Handle any exceptions that doit might raise here

【讨论】:

  • 不是我所期望的,但它确实以另一种方式工作。所以谢谢。
  • 我们可以在这里有一个可选参数来使超时起作用吗?例如,如果提供了 read_sql_query 可以采用可选参数,否则使用该函数的默认内部超时值运行。
猜你喜欢
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 2019-10-14
  • 2016-07-16
  • 2011-03-19
  • 1970-01-01
相关资源
最近更新 更多