2012-11-03 7 views
11

この質問は非常に簡単に答える必要があるようですが、数日間の研究といくつかの死んだ終わりの後に、ユーザベースのOAuthを主張することなくクエリ結果をBigQueryから得ることができません。誰にもこれで運があったのですか?私のアプリにGoogle AppEngineを使用していません。EC2でホストされています。ここでは、正確な状況は次のとおりです。私は、Googleの例に従うたびエンドユーザとのやりとりをせずにPyQueryからプログラムでBigQueryをクエリするにはどうすればよいですか?

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

、私は認証に使用するGoogleアカウントを選択するために私を求めてポップアップするWebブラウザを取得してしまいます。

答えて

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、Service Account Email、およびキーファイルで上記のコードを実行しましたが、リストデータセットのレスポンスを取得すると、DICには「datasets」キーはありません。これは、次のようなものです。{u'kind ':u'bigquery#datasetList'、u'etag ':u' "viowSXH0JIvMREGVicRueTw4PZo/L-a0Zjajjjhksaj6mKpTzCQGsr4" '} – JawsTheGame

+1

したがって、フォローアップするには、 .datasets()。list()メソッド。上記の例では、response ['datasets']オブジェクトには、データセット記述オブジェクトのリストが{u'kind ':u'bigquery#dataset'、u'id ':u'projectXXXXXXX:TestDataset' 、u'datasetReference ':{u'projectId':u'projectXXXXXXX '、u'datasetId':u'TestDataset '}} –

+0

もう1つのこと: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'環境変数を設定することは、混在環境で資格情報を設定する最も信頼できる方法です。 –

関連する問題