Python3使用Google BigQuery流式写入报400 No rows错误未捕获问题
错误可能的产生原因
- 传入
client.insert_rows的待插入数据集bigquery_rows_to_insert本身为空,服务端校验请求时未检测到有效行,直接返回400错误 - 构造的行数据格式不符合BigQuery要求,所有行都在SDK发送请求前被过滤丢弃,最终发往服务端的请求没有有效载荷
- 若使用的是旧版本BigQuery Python SDK,存在已知边界bug:当行数据所有字段全为NULL、或字段名与表结构完全不匹配时,SDK会静默丢弃全部行,最终发起空请求触发错误
现有捕获逻辑未生效的原因
- 当前代码只捕获了
assert语句抛出的AssertionError,但BadRequest 400属于请求层面的全局异常,client.insert_rows方法遇到这类错误时会直接抛出对应异常(google.api_core.exceptions.BadRequest),根本不会执行到后续的assert校验步骤,自然无法被捕获 insert_rows方法的返回值errors仅用来承载行级插入错误(比如单条数据字段类型不匹配、缺少必填字段),所有请求级别的全局错误(空请求、权限不足、目标表不存在等)都会直接以异常形式抛出,不会写入返回的errors列表,你现有只校验返回值的逻辑覆盖不到这类问题。
内容的提问来源于stack exchange,提问作者Vit Amin
相关产品推荐
相关产品推荐

