Azure Function Apps集成Google BigQuery触发AttributeError报错
问题原因
这个报错和BigQuery权限、服务账号配置、查询逻辑都没有关系,是Python依赖版本冲突导致的:
- 触发点在导入google cloud bigquery SDK的阶段,
google.rpc.error_details_pb2模块加载时找不到对应的protobuf描述符,DESCRIPTOR变量为None,调用message_types_by_name属性就抛出了空对象错误 - 普通本地Python环境没有Azure Function Python Worker自带的依赖干扰,安装的google SDK和protobuf版本匹配,所以代码可以正常运行
- Azure Function本地调试用的Core Tools、云端运行的Worker都会预置一套protobuf依赖,如果项目自己安装的protobuf版本和Worker预置版本、BigQuery SDK要求的版本范围不匹配,就会触发这个导入错误。
修复方案
按以下顺序操作即可解决:
- 固定依赖版本,避免版本自动升级带来的冲突
在项目根目录的requirements.txt中明确指定兼容的依赖版本,不要留版本范围让pip自动拉取最新版:
本地先清理虚拟环境里的冲突包再重装:azure-functions google-cloud-bigquery==3.5.0 protobuf==4.21.6 google-api-core==2.10.2 googleapis-common-protos==1.56.4pip uninstall -y protobuf google-api-core googleapis-common-protos google-cloud-bigquery grpcio pip install -r requirements.txt - 调整BigQuery客户端初始化位置
不要在Python模块的全局作用域直接初始化BigQuery客户端,把初始化逻辑移到Azure Function的入口函数内部,避免模块加载阶段就触发全量依赖导入,同时减少函数冷启动的资源占用:import azure.functions as func from google.cloud import bigquery as bq import os import json def main(req: func.HttpRequest) -> func.HttpResponse: # 函数入口内设置凭证、初始化客户端 os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "path/to/my/service-account-file.json" client = bq.Client() query_job = client.query("select * from project.dataset.table limit 1") rows = [dict(row) for row in query_job.result()] return func.HttpResponse(json.dumps(rows), mimetype="application/json") - 清理缓存避免旧依赖干扰
本地调试如果仍复现报错,删除项目下的__pycache__、.python_packages文件夹,再重新启动func调试主机;云端部署时选择远程构建依赖,不要直接上传Windows本地预安装的site-packages包,避免二进制文件和Azure云端Linux运行环境不兼容。
校验标准
触发函数后不再出现Worker加载失败的日志,能正常返回BigQuery的查询结果即为修复完成。如果仍有相同报错,登录Function的Kudu控制台检查site-packages下的protobuf版本,确认是4.21.x系列即可,版本低于3.20.x或者高于4.22.x都会触发这个兼容问题。
内容的提问来源于stack exchange,提问作者Ajit
相关产品推荐
相关产品推荐

