4
votes

I'd like to access BigQuery data from my local Linux machine with Python. The code from Google help https://cloud.google.com/bigquery/authorization#service-accounts-server works fine giving me the list of datasets. But the query send via service library

SELECT id, name FROM [test_articles.countries] LIMIT 100

fail with "Login Required" message:

googleapiclient.errors.HttpError: <HttpError 401 when requesting https://www.googleapis.com/bigquery/v2/projects/myproject/queries?alt=json returned "Login Required">

In BigQuery Web UI the query works fine. For auth I use " Google APIs service account" from my Google Development console with permission "Can edit".

Here is the whole code

import httplib2

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

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

f = file('xxxxx.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_ID).execute(http)

print('Dataset list:\n')
for dataset in response['datasets']:
  print("%s\n" % dataset['id'])


# SELECT data

query_data = {'query':'
    SELECT id, name FROM [test_articles.countries] LIMIT 100;
'}
query_request = service.jobs()
query_response = query_request.query(projectId=PROJECT_ID, 
    body=query_data).execute()
pp.pprint(query_response)
2

2 Answers

2
votes

Instead of:

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

Try:

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

(use the authenticated http connection when building the service)

2
votes

Make sure to log into your gcloud account through the terminal:

gcloud auth application-default login