Python通过ADC连接Google BigQuery报NewConnectionError排查
问题说明
- 目标:通过Python读取Google BigQuery表数据
- 现有条件:无服务账号访问权限,持有gcloud授予的BigQuery个人访问权限,以及Application Default Credentials(ADC)对应的JSON凭证文件
- 测试代码:
from google.cloud import bigquery conn=bigquery.Client() query="select * from my_data.test1" conn.query(query)
- 运行报错:
NewConnectionError: <urllib3.connection.HttpsConnection object at 0x83dh46bdu640>: Failed to establish a new connection:[Error -2] Name or Service not known
- 环境状态:
GOOGLE_APPLICATION_CREDENTIALS环境变量未设置,值为空
解决步骤
第一步:先排查网络连通性
报错里的Name or Service not known属于DNS解析失败错误,首先确认当前运行环境可以正常访问Google公网服务,能够正常解析BigQuery的服务域名,网络不通的情况下任何凭证配置都无法生效。
第二步:正确加载ADC凭证
持有的个人ADC凭证完全可以用来访问BigQuery,不需要额外申请服务账号,两种配置方式选一种即可:
方式1:配置环境变量(最省事,无需改代码)
在运行Python脚本的终端里,先执行命令把GOOGLE_APPLICATION_CREDENTIALS变量指向手里的JSON凭证文件的绝对路径:
- Linux/macOS终端:
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/adc_credential.json"
- Windows命令提示符(CMD):
set GOOGLE_APPLICATION_CREDENTIALS=C:\path\to\your\adc_credential.json
- Windows PowerShell:
$env:GOOGLE_APPLICATION_CREDENTIALS="C:\path\to\your\adc_credential.json"
配置完直接运行原有Python代码即可,BigQuery SDK会自动从环境变量读取凭证完成认证,不需要修改代码逻辑。
方式2:代码内显式传入凭证(不影响全局环境)
如果不想修改系统环境变量,可以在初始化BigQuery客户端的时候手动加载凭证文件,修改后的可运行代码如下:
from google.cloud import bigquery from google.oauth2 import service_account # 替换成自己的ADC凭证文件绝对路径 CRED_PATH = "/path/to/your/adc_credential.json" # 替换成自己的GCP项目ID PROJECT_ID = "your-gcp-project-id" credentials = service_account.Credentials.from_service_account_file( CRED_PATH, scopes=["https://www.googleapis.com/auth/bigquery"] ) conn = bigquery.Client(credentials=credentials, project=PROJECT_ID) query = "select * from my_data.test1" # 必须调用result()才会实际执行查询,拿到返回结果 query_job = conn.query(query) results = query_job.result() # 遍历读取结果示例 for row in results: print(dict(row))
补充注意事项
- 原测试代码里只调用了
conn.query(query),没有追加.result(),就算网络和凭证都配置正确,也不会真正执行查询,只会返回一个未完成的查询作业对象,拿不到数据。 - 确认持有的ADC凭证对应的账号,已经被授予了目标表
my_data.test1的读取权限(比如BigQuery Data Viewer角色),否则认证通过后会抛出权限拒绝错误。 - 如果ADC凭证是通过gcloud CLI生成的个人用户凭证,也可以直接在终端执行
gcloud auth application-default login命令重新刷新本地默认凭证,执行完成后不需要手动指定JSON文件路径,SDK会自动读取本地存储的默认凭证。
内容的提问来源于stack exchange,提问作者Yogesh Chander
相关产品推荐
相关产品推荐

