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
相关产品推荐
相关产品推荐

