解决pd.read_gbq访问BigQuery的403错误并指定特定用户账号
这个403权限拒绝错误很常见,本质是当前默认使用的账号没有目标BigQuery项目的访问权限。要指定特定用户/服务账号来连接,你可以试试下面几种实用方法:
方法1:使用服务账号密钥文件(推荐用于生产环境)
服务账号是Google Cloud中专门用于程序访问的账号,稳定性高,适合生产场景:
- 先在Google Cloud控制台为目标项目创建一个服务账号,分配必要的权限(比如
BigQuery Data Viewer和BigQuery Job User),然后下载该账号的JSON密钥文件。 - 在代码中通过
credentials参数指定这个密钥文件:
import pandas as pd from google.oauth2 import service_account # 加载服务账号密钥 credentials = service_account.Credentials.from_service_account_file( '/绝对路径/到你的服务账号密钥.json' ) project_id = "xxxx" df = pd.read_gbq( "select * from table", project_id=project_id, credentials=credentials )
这样代码就会强制使用这个服务账号的权限来访问BigQuery,避免默认账号的权限问题。
方法2:指定个人用户账号(适合开发/测试场景)
如果想用特定的个人Google账号(比如你的工作邮箱)来连接,可以通过OAuth交互式验证指定账号:
import pandas as pd import os from google.auth.transport.requests import Request from google.oauth2.credentials import Credentials from google_auth_oauthlib.flow import InstalledAppFlow # 替换成你要使用的目标用户邮箱 target_account = "your-specific-email@example.com" # 从Google Cloud控制台下载的OAuth客户端ID文件路径 client_secret_path = "/路径/到/client_secret.json" # 保存授权凭据的文件,避免每次重复登录 token_path = "token.json" creds = None # 读取已保存的凭据 if os.path.exists(token_path): creds = Credentials.from_authorized_user_file(token_path, ['https://www.googleapis.com/auth/bigquery']) # 检查凭据是否有效,或者是否是目标账号 if not creds or not creds.valid or creds.id_token.get('email') != target_account: if creds and creds.expired and creds.refresh_token: creds.refresh(Request()) else: # 触发交互式登录,强制选择账号 flow = InstalledAppFlow.from_client_secrets_file( client_secret_path, ['https://www.googleapis.com/auth/bigquery'] ) flow.redirect_uri = 'urn:ietf:wg:oauth:2.0:oob' auth_url, _ = flow.authorization_url(prompt='select_account') print(f"请打开以下URL并选择{target_account}授权:\n{auth_url}") auth_code = input("输入页面上的授权码:") flow.fetch_token(code=auth_code) creds = flow.credentials # 保存凭据供下次使用 with open(token_path, 'w') as f: f.write(creds.to_json()) project_id = "xxxx" df = pd.read_gbq( "select * from table", project_id=project_id, credentials=creds )
第一次运行时会弹出授权链接,你需要选择指定的账号完成授权,后续运行就会自动使用该账号的凭据。
方法3:通过环境变量指定账号(快速测试)
如果不想修改代码,可以通过设置环境变量来指定服务账号密钥文件,pd.read_gbq会自动读取这个环境变量:
- Linux/macOS终端:
export GOOGLE_APPLICATION_CREDENTIALS="/路径/到/服务账号密钥.json"
- Windows命令行:
set GOOGLE_APPLICATION_CREDENTIALS=C:\路径\到\服务账号密钥.json
- 代码内设置(无需终端操作):
import os os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "/路径/到/服务账号密钥.json" import pandas as pd project_id = "xxxx" df = pd.read_gbq("select * from table", project_id)
重要提醒
不管用哪种方法,都要确保你指定的账号已经在目标BigQuery项目中被授予了必要的权限:至少需要BigQuery Data Viewer来读取表数据,以及BigQuery Job User来提交查询任务。
内容的提问来源于stack exchange,提问作者user888
相关产品推荐
相关产品推荐

