2012-11-03 5 views
11

Questa domanda sembra essere la risposta più semplice, ma dopo giorni di ricerche e diversi vicoli ciechi, non riesco a ottenere risultati di query a partire da BigQuery senza che si insista su OAuth basato sull'utente. Qualcuno ha avuto fortuna con questo? Non sto utilizzando Google AppEngine per la mia app, è ospitato in EC2. Qui è la situazione esatta:Come interrogare BigQuery a livello di codice da Python senza interazione con l'utente finale?

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

Ogni volta che seguire gli esempi di Google, mi finisce per ottenere un browser web che appaiono a chiedere per me, per selezionare un account Google da utilizzare per l'autenticazione.

risposta

16

Ci scusiamo per il fatto che sia così impegnativo trovare informazioni su. Stai cercando quello che viene chiamato Service Accounts che sono documentati nella nostra guida Authorizing Access to the BigQuery API using OAuth 2.0.

Ecco un esempio, utilizzando il Python client library, anche se si consiglia di guardare la documentazione di per informazioni acquisire le credenziali appropriate:

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, grazie della risposta. Questo mi fa andare oltre. Avevo già eseguito gli Account di servizio in precedenza ed era chiaro che questo era quello che stavo cercando, ma non riuscivo a scoprire dove metterlo a punto. Ho fatto così, e ho eseguito il codice di cui sopra con il mio ProjectId corretto, e-mail di account di servizio, e il file chiave, ma quando afferro la risposta per elencare i set di dati, non vi è alcuna chiave 'set di dati' nel dett. Invece è qualcosa del genere: {u'kind ': u'bigquery # datasetList', u'etag ': u' "viowSXH0JIvMREGVicRUeTw4PZo/L-a0Zjajejhksaj6mKpTzCQGsr4" '} – JawsTheGame

+1

Quindi, per il follow up, assicurati di chiamare il servizio .datasets(). list() metodo. Nell'esempio sopra, l'oggetto response ['datasets'] conterrà un elenco di oggetti di descrizione del set di dati, nella forma di {u'kind ': u'bigquery # dataset', u'id ': u'projectXXXXXXX: TestDataset' , u'datasetReference ': {u'projectId': u'projectXXXXXXX ', u'datasetId': u'TestDataset '}} –

+0

Un'altra cosa: se non ci sono set di dati nella risposta API, è probabile che tu non abbia creato ancora nessuno. Puoi confermare di averlo fatto nel progetto che stai utilizzando? –

0

Ho avuto lo stesso problema. È probabilmente perché non si dispone delle autorizzazioni necessarie nel progetto per la chiave dell'account di servizio che si sta utilizzando.

+0

Questo è più un commento che una risposta. Si prega di prendere in considerazione la pubblicazione di brevi risposte come commenti. –

2

Se il login localmente con gcloud:

gcloud auth application-default login 

occorre segnalare un credenziali verranno memorizzate in ~/.config/gcloud /, che può essere caricato con:

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

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

Oppure si può basta caricare il file della chiave di sicurezza BQ direttamente con:

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

Grazie per una risposta che utilizza le ultime librerie. Tieni presente che ora esiste una pagina di documentazione https://cloud.google.com/bigquery/docs/authentication/service-account-file che tratta questi metodi di autenticazione. –

+0

Si noti che 'gcloud auth application-default login' non è più raccomandato.Il download di un file chiave JSON per un account di servizio e l'impostazione della variabile di ambiente 'GOOGLE_APPLICATION_CREDENTIALS' rappresentano il modo più affidabile per impostare le credenziali in ambienti misti. –