Как программно запрашивать BigQuery из Python без взаимодействия с конечным пользователем?

Кажется, что на этот вопрос должно быть так просто ответить, но после нескольких дней исследований и нескольких тупиков я не могу получить результаты запроса из BigQuery, не настаивая на пользовательском OAuth. Кому-нибудь повезло с этим? Я не использую Google AppEngine для своего приложения, оно размещено в EC2. Вот точная ситуация:

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

Всякий раз, когда я следую примерам Google, у меня появляется всплывающее окно веб-браузера с просьбой выбрать учетную запись Google для аутентификации.


person JawsTheGame    schedule 03.11.2012    source источник


Ответы (3)


Извините, это так сложно найти информацию. Вы ищете так называемые сервисные аккаунты, которые описаны в нашей Авторизация доступа к BigQuery API с помощью OAuth 2.0.

Вот пример использования клиентской библиотеки Python, хотя вы можете просмотреть ссылочную документацию для получения информации о получение соответствующих полномочий:

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']
person Ryan Boyd    schedule 03.11.2012
comment
Райан, спасибо за ответ. Это заводит меня дальше. Раньше я сталкивался с учетными записями служб, и было ясно, что это то, что я искал, я просто не мог найти, где это настроить. Я сделал это и запустил приведенный выше код с моим правильным ProjectId, адресом электронной почты учетной записи службы и файлом ключа, но когда я получаю ответ для перечисления наборов данных, в dict нет ключа «наборы данных». Вместо этого это примерно так: {u'kind': u'bigquery#datasetList', u'etag': u'viowSXH0JIvMREGVicRUeTw4PZo/L-a0Zjajejhksaj6mKpTzCQGsr4'} - person JawsTheGame; 05.11.2012
comment
Итак, чтобы продолжить, убедитесь, что вы вызываете метод service.datasets().list(). В приведенном выше примере объект response['datasets'] будет содержать список объектов описания набора данных в форме {u'kind': u'bigquery#dataset', u'id': u'projectXXXXXXX:TestDataset' , u'datasetReference': {u'projectId': u'projectXXXXXXX', u'datasetId': u'TestDataset'}} - person Michael Manoochehri; 06.11.2012
comment
Еще одно: если у вас нет наборов данных в ответе API, скорее всего, вы их еще не создали. Можете ли вы подтвердить, что вы сделали это в проекте, который используете? - person Michael Manoochehri; 10.11.2012
comment
Райан, спасибо за ответ. Документы вроде повсюду. Но я рад, что кто-то из Google слушает - person a.m.; 17.10.2013
comment
4 года спустя и та же проблема - в документах обычно предполагается, что будут использоваться серверы Google. И предложенный метод SignedJwtAssertionCredentials не существует. Добавили ответ о том, что в настоящее время работает для меня. - person hoju; 13.12.2016

Если вы входите локально с помощью 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)
person hoju    schedule 13.12.2016
comment
Спасибо за ответ, в котором используются последние библиотеки. Обратите внимание, что теперь есть страница документации cloud.google.com/bigquery/ docs/authentication/, в котором описаны эти методы аутентификации. - person Tim Swast; 01.12.2017
comment
Обратите внимание, что gcloud auth application-default login больше не рекомендуется. Загрузка файла ключа JSON для учетной записи службы и установка переменной среды GOOGLE_APPLICATION_CREDENTIALS — самый надежный способ установки учетных данных в смешанных средах. - person Tim Swast; 01.12.2017

Я была такая же проблема. Возможно, это связано с тем, что у вас нет необходимых разрешений в проекте для ключа учетной записи службы, который вы используете.

person Sai J    schedule 29.02.2016
comment
Это скорее комментарий, чем ответ. Пожалуйста, рассмотрите возможность публикации кратких ответов в качестве комментариев. - person K.Nicholas; 01.03.2016