2012-11-03 18 views
11

這個問題似乎應該是如此簡單的回答,但經過幾天的研究和幾個死衚衕,我似乎無法得到BigQuery查詢結果沒有堅持基於用戶的OAuth。有沒有人有這樣的運氣?我沒有使用Google AppEngine作爲我的應用程序,它位於EC2。下面是具體情況:如何在沒有最終用戶交互的情況下從Python以編程方式查詢BigQuery?

User wants reporting data --> 
Web server makes queries to BigQuery --> 
Data is transformed for use in WebApp and returned to User. 

每當我按照谷歌的例子,我最終得到一個網頁瀏覽器彈出要求我選擇一個谷歌帳戶,用於身份驗證。

回答

16

對不起,這是如此具有挑戰性的信息。您正在尋找Service Accounts這是我們的Authorizing Access to the BigQuery API using OAuth 2.0指南中記錄的。

下面是一個例子,使用Python client library,但你要看看引用文檔信息上獲取相應的憑據:

import httplib2 

from apiclient.discovery import build 
from oauth2client.client import SignedJwtAssertionCredentials 

# REPLACE WITH YOUR Project ID 
PROJECT_NUMBER = 'XXXXXXXXXXX' 
# REPLACE WITH THE SERVICE ACCOUNT EMAIL FROM GOOGLE DEV CONSOLE 
SERVICE_ACCOUNT_EMAIL = '[email protected]' 

# OBTAIN THE KEY FROM THE GOOGLE APIs CONSOLE 
# More instructions here: http://goo.gl/w0YA0 
f = file('key.p12', 'rb') 
key = f.read() 
f.close() 

credentials = SignedJwtAssertionCredentials(
    SERVICE_ACCOUNT_EMAIL, 
    key, 
    scope='https://www.googleapis.com/auth/bigquery') 

http = httplib2.Http() 
http = credentials.authorize(http) 

service = build('bigquery', 'v2') 
datasets = service.datasets() 
response = datasets.list(projectId=PROJECT_NUMBER).execute(http) 

print 'Dataset list:' 
for dataset in response['datasets']: 
    print '%s' % dataset['datasetReference']['datasetId'] 
+1

Ryan,感謝您的回覆。這讓我進一步。我早些時候跑過服務賬戶,很明顯,這是我正在尋找的東西,我無法找到在哪裏設置。我已經這樣做了,並且使用正確的ProjectId,服務帳戶電子郵件和密鑰文件運行了上面的代碼,但是當我獲取列表數據集的響應時,字典中沒有「數據集」鍵。相反,它是這樣的:{u'kind':u'bigquery#datasetList',u'etag':u'「viowSXH0JIvMREGVicRUeTw4PZo/L-a0Zjajejhksaj6mKpTzCQGsr4」'} – JawsTheGame

+1

因此,要跟進,請確保您正在調用服務.datasets().list()方法。在上面的示例中,響應['datasets']對象將包含數據集描述對象的列表,格式爲{u'kind':u'bigquery#dataset',u'id':u'projectXXXXXXX:TestDataset' ,u'datasetReference':{u'projectId':u'projectXXXXXXX',u'datasetId':u'TestDataset'}} –

+0

另一件事:如果您的API響應中沒有數據集,則可能是您尚未創建任何尚未。你能否確認你在使用的項目中是這樣做的? –

0

我有同樣的問題。這可能是因爲您沒有在項目中使用您所使用的服務帳戶密鑰的必需權限。

+0

這不僅僅是一個回答而是一個評論。請考慮發佈簡短回覆作爲評論。 –

2

如果用gcloud本地登錄:

gcloud auth application-default login 

然後,憑證文件將被存儲在〜/的.config/gcloud /,它可以裝載:

from oauth2client.client import GoogleCredentials 
from apiclient.discovery import build 

credentials = GoogleCredentials.get_application_default() 
service = build('bigquery', 'v2') 

或者你可以只需直接加載BQ安全密鑰文件:

from google.cloud import bigquery 
client = bigquery.Client.from_service_account_json(path_to_key.json) 
+0

感謝您使用最新庫的答案。請注意,現在有一個涵蓋這些身份驗證方法的文檔頁面https://cloud.google.com/bigquery/docs/authentication/service-account-file。 –

+0

請注意,不再推薦'gcloud auth application-default login'。下載服務帳戶的JSON密鑰文件並設置「GOOGLE_APPLICATION_CREDENTIALS」環境變量是在混合環境中設置憑據的最可靠方法。 –

相關問題