You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BigQuery Python客户端无法捕获多语句查询的审计日志错误

问题

在使用BigQuery Python客户端执行含多语句的查询(比如在CREATE TABLE语句前添加DECLARE变量声明)时,若查询存在变量声明语法错误,客户端未捕获该错误,直接判定任务状态为DONE,但审计日志中能看到明确的错误信息。

客户端代码片段

query_job = self.client.query(query) 
print(dir(query_job))
# print(query_job.exception())
with suppress(TypeError):
    # 原代码注释链接已移除
    exc = query_job.exception()
    if exc:
        raise exc
while (query_job.state != 'DONE'):
    
    print("Job {} is currently in state {}".format(query_job.job_id, query_job.state))

    if query_job.errors is not None:
        raise Exception("Bigquery job failed with error {}".format(query_job.errors)) 

    query_job = self.client.get_job(query_job.job_id)
    print(query_job.total_bytes_processed)
    print(query_job.errors)
    time.sleep(wait)

审计日志中的错误信息

jobStatus: {
error: {
code: 11
message: "Query error: Unrecognized name: varname at [4:56]"
}
state: "DONE"
}}}}
serviceName: "bigquery.googleapis.com"

请问是否有方法可以捕获此类错误/异常?


解决方法

要捕获这类错误,核心是在任务状态变为DONE后,主动检查query_job.errors属性——这类语法错误会直接终止查询并将任务标记为DONE,但错误信息会留存于errors中。调整代码逻辑即可实现:

优化后的代码示例

query_job = self.client.query(query)
wait = 5  # 自定义任务状态轮询间隔

# 轮询等待任务完成
while query_job.state != 'DONE':
    print(f"Job {query_job.job_id} 当前状态: {query_job.state}")
    query_job = self.client.get_job(query_job.job_id)
    time.sleep(wait)

# 任务完成后强制校验错误
if query_job.errors is not None:
    # 解析并拼接错误信息
    error_msg = "; ".join([err["message"] for err in query_job.errors])
    raise Exception(f"BigQuery任务执行失败: {error_msg}")

# 任务成功后的后续逻辑
print(f"任务 {query_job.job_id} 执行完成")

关键说明

  • BigQuery中,部分语法错误不会让任务停留在运行状态,而是直接终止并标记为DONE,因此必须在任务完成后主动检查errors
  • query_job.errors是错误信息列表,每个元素包含message、reason等细节,可按需解析输出
  • 无需依赖exception()方法,直接检查errors属性的可靠性更高,尤其适配多语句查询场景

内容的提问来源于stack exchange,提问作者Nixon Raphy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 00:05:21