如果列表元素在循环中花费 X 时间到 运行,则验证它们

Validate list elements if they take X time to run in a loop

我有一个列表,其中包含 SQL 可以在外部 Trino CLI 中执行的代码。因此,例如,我的嵌套列表如下所示:

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秒,则kill它,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])

但它并没有太大作用,我总是偶尔会超时。有什么想法吗?

而不是实际 运行 查询,您可以询问 Trino 查询语法是否有效。只需将以下内容添加到您的每个查询中:

EXPLAIN (TYPE VALIDATE)

https://trino.io/docs/current/sql/explain.html#explain-type-validate