通过BigQuery python api查询联合表(Google Drive)

通过BigQuery python api查询联合表(Google Drive),python,google-bigquery,gcloud,Python,Google Bigquery,Gcloud,(这里有很多类似的线程,但不幸的是,我在这里或Goolge上的任何地方都找不到错误的答案) 我试图在BigQuery中查询一个联邦表,它指向驱动器中的一个电子表格 我已运行以下命令为gcloud创建默认应用程序凭据: $ gcloud auth application-default login 但这并没有将驱动器包含在作用域中,因此我得到了以下错误消息(这是有意义的):禁止:403拒绝访问:BigQuery BigQuery:未找到具有Google驱动器作用域的OAuth令牌 然后我尝试使用

(这里有很多类似的线程,但不幸的是,我在这里或Goolge上的任何地方都找不到错误的答案)

我试图在BigQuery中查询一个联邦表,它指向驱动器中的一个电子表格

我已运行以下命令为gcloud创建默认应用程序凭据:

$ gcloud auth application-default login
但这并没有将驱动器包含在作用域中,因此我得到了以下错误消息(这是有意义的):禁止:403拒绝访问:BigQuery BigQuery:未找到具有Google驱动器作用域的OAuth令牌

然后我尝试使用显式驱动器作用域进行身份验证:

$ gcloud auth application-default login --scopes=https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/bigquery
之后,当我尝试使用bigquery python api时,会出现以下错误:

“禁止:403访问被拒绝:BigQuery BigQuery:访问未配置。驱动器API以前未在project 764086051850中使用过或已被禁用。请通过访问来启用它,然后重试。如果您最近启用了此API,请等待几分钟,使该操作传播到我们的系统,然后重试。”

上述项目编号在我们的组织中不存在,提供的链接指向一个页面,其中显示: API“drive.googleapis.com”不存在,或者您没有访问它的权限

驱动器API对于默认项目是绝对启用的,因此错误消息没有多大意义。我还可以使用
bq query\u string
命令从终端查询表

我目前没有办法进一步调试,有人建议吗?

配置:
谷歌云SDK 187.0.0
Python 2.7
谷歌云0.27.0
google cloud bigquery 0.29.0

使用默认凭据时可能会出现问题。但是,您可以使用服务帐户,将凭据保存在JSON文件中,并添加必要的作用域。我做了一个快速测试,该代码对我有效:

from google.cloud import bigquery
from google.oauth2.service_account import Credentials

scopes = (
        'https://www.googleapis.com/auth/bigquery',
        'https://www.googleapis.com/auth/cloud-platform',
        'https://www.googleapis.com/auth/drive'
)
credentials = Credentials.from_service_account_file('/path/to/credentials.json')
credentials = credentials.with_scopes(scopes)
client = bigquery.Client(credentials=credentials)

query = "SELECT * FROM dataset.federated_table LIMIT 5"
query_job = client.query(query)
rows = query_job.result()
for row in rows: print(row)

如果您收到404 not found错误是因为您需要与服务帐户共享电子表格(查看权限)

您是否已完成此处概述的3个步骤:@GrahamPolley谢谢您的回答!我没有使用服务帐户,而是通过我自己的帐户登录。但是,是的,驱动器API已启用,并且我可以访问电子表格(我可以通过
$bq query
查询表格)。如上所示,请求驱动器作用域。或者,
$gcloud auth application default login
应该只与服务帐户一起使用吗?正如我前面所述,错误消息提到了一个项目,它甚至不是我们组织的一部分。更不用说它不是我在
$gcloud init
上设置的默认项目,我不太理解它。您是否在python脚本中使用由
gcloud init
创建的凭据?我在python脚本中使用应用程序默认凭据。如下所示:
from google.cloud import bigquery client=bigquery.client()query=“SELECT*from tablename LIMIT 5”query\u job=client.query(query)rows=query\u job.result()对于行中的行:print(row.name)
,我尝试并发现
范围
'https://www.googleapis.com/auth/cloud-platform“
是不需要的