You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:10:52