【发布时间】:2021-12-09 17:27:27
【问题描述】:
我有一个列表,其中包含可以在外部 Trino CLI 中执行的 SQL 代码。例如,我的嵌套列表如下所示:
sql = []
sql = [['test 1', 'SELECT * FROM a.testtable1'],['test 2', 'SELECT * FROM a.testtable1']]
这个简单的循环检测是否有语法错误:
sql_results = []
for l in sql:
sql_code = l[1]
try:
cur.execute(sql_code
rows = cur.fetchall()
except Exception as e:
status = str(e)
status = 'OK' if len(rows) > 1
sql_results.append([l[0],sql_code,status])
效果很好,但有时查询时间过长并终止进程。知道如果一个查询在执行过程中持续时间超过 3 秒,那么这意味着语法是好的(我只对检查语法感兴趣,而不是查询结果)我想添加一个时间验证。就像是: 如果 SQL 执行持续超过 3 秒,则将其杀死并 status = 'OK'
我用时间试过这个:
import time
sql_results = []
for l in sql:
sql_code = l[1]
try:
timeout = time.time() + 2
cur.execute(sql_code)
rows = cur.fetchall()
except Exception as e:
status = str(e)
status = 'OK' if len(rows) > 1 or time.time() > timeout
sql_results.append([l[0],sql_code,status])
但这并没有多大作用,而且我不断收到偶尔的超时。有什么想法吗?
【问题讨论】:
-
您可以在可能超时的单独线程中运行 SQL 查询,即Most Pythonic way to kill a thread after some period of time
-
这是要走的路。有了这个和我得到的答案(解释......)我解决了我的问题。
标签: python loops time sdk trino