2012-11-03 25 views
11

Câu hỏi này có vẻ rất đơn giản để trả lời, nhưng sau nhiều ngày nghiên cứu và một số kết thúc chết, tôi dường như không nhận được kết quả truy vấn từ BigQuery mà không cần nhấn mạnh vào OAuth dựa trên người dùng. Có ai có bất kỳ may mắn với điều này? Tôi không sử dụng Google AppEngine cho ứng dụng của mình, nó được lưu trữ trong EC2. Đây là tình huống chính xác:Cách truy vấn BigQuery theo lập trình từ Python mà không có tương tác của người dùng cuối?

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

Bất cứ khi nào tôi làm theo các ví dụ của Google, tôi sẽ nhận được một trình duyệt web yêu cầu tôi chọn tài khoản Google để sử dụng để xác thực.

Trả lời

16

Xin lỗi, việc này đang rất khó khăn để tìm thông tin. Bạn đang tìm kiếm những gì được gọi là Service Accounts được ghi lại trong hướng dẫn Authorizing Access to the BigQuery API using OAuth 2.0 của chúng tôi.

Dưới đây là một ví dụ, bằng cách sử dụng Python client library, mặc dù bạn sẽ muốn xem xét các tài liệu tham khảo để biết về việc mua các chứng chỉ thích hợp:

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, cảm ơn phản hồi của bạn. Điều này giúp tôi tiếp tục hơn. Tôi đã chạy qua các tài khoản dịch vụ trước đó và rõ ràng rằng đây là những gì tôi đang tìm kiếm, tôi chỉ không thể tìm ra nơi để thiết lập này. Tôi đã làm như vậy, và đã chạy mã ở trên với ProjectId chính xác, Email tài khoản dịch vụ và tệp khóa của tôi, nhưng khi tôi lấy phản hồi để liệt kê các tập dữ liệu, không có khóa 'datasets' trong dict. Thay vào đó nó là một cái gì đó như thế này: {u'kind ': u'bigquery # datasetList', u'etag ': u' 'viowSXH0JIvMREGVicRUeTw4PZo/L-a0Zjajejhksaj6mKpTzCQGsr4 "'} – JawsTheGame

+1

Vì vậy, để theo dõi, hãy chắc chắn rằng bạn đang gọi dịch vụ .datasets(). list() phương thức. Trong ví dụ trên, đối tượng ['datasets'] phản hồi sẽ chứa danh sách các đối tượng mô tả tập dữ liệu, dưới dạng {u'kind ': u'bigquery # dataset', u'id ': u'projectXXXXXXX: TestDataset' , u'datasetReference ': {u'projectId': u'projectXXXXXXX ', u'datasetId': u'TestDataset '}} –

+0

Một điều nữa: Nếu bạn không có bộ dữ liệu trong phản hồi API của mình, có thể bạn chưa tạo chưa cái nào hết. Bạn có thể xác nhận rằng bạn đã làm như vậy trong dự án mà bạn đang sử dụng không? –

0

tôi đã cùng một vấn đề. Có thể là do bạn không có các quyền cần thiết trong Dự án cho khóa Tài khoản dịch vụ mà bạn đang sử dụng.

+0

Đây là một bình luận nhiều hơn là một câu trả lời. Vui lòng xem xét đăng phản hồi ngắn dưới dạng nhận xét. –

2

Nếu bạn đăng nhập tại địa phương với gcloud:

gcloud auth application-default login 

Sau đó, một thông tin nộp sẽ được lưu trữ trong ~/.config/gcloud /, có thể được nạp với:

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

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

Hoặc bạn có thể chỉ cần tải tệp khóa bảo mật BQ trực tiếp bằng:

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

Cảm ơn bạn đã trả lời sử dụng các thư viện mới nhất. Lưu ý rằng hiện tại có trang tài liệu https://cloud.google.com/bigquery/docs/authentication/service-account-file bao gồm các phương pháp xác thực này. –

+0

Lưu ý rằng 'đăng nhập mặc định ứng dụng mặc định gcloud auth không còn được khuyến nghị.Tải xuống tệp khóa JSON cho tài khoản dịch vụ và đặt biến môi trường 'GOOGLE_APPLICATION_CREDENTIALS' là cách đáng tin cậy nhất để đặt thông tin xác thực trong môi trường hỗn hợp. –

Các vấn đề liên quan