2017-10-12 71 views
1

我想從谷歌閱讀扳手錶與時間戳,使用下面的代碼。扳手閱讀與時間戳失敗

import datetime as dt 
from google.cloud.spanner.client import Client 

proj = 'my_project' 
inst = 'my_instance' 
db = 'my_database' 

datetime_now = dt.datetime.now() 
with Client(proj).instance(inst).database(db).snapshot(read_timestamp=datetime_now) as snapshot: # this fails 
#with Client(proj).instance(inst).database(db).snapshot() as snapshot: # this works 
    result = snapshot.execute_sql('some SQL query') 
    for row in result: 
     print row 

如果我在 「快照」 呼叫設定時間戳,此返回錯誤消息下面:

grpc._channel._Rendezvous:RPC與封端的< _Rendezvous(StatusCode.DEADLINE_EXCEEDED,截止日期超過)>

while,if I just call「[...]。snapshot()」,表格被正確讀取。

這是我的腳本中的錯誤還是安裝問題?

編輯:剛纔注意到我並不是最新版本的python spanner API。在從0.26更新爲0.28之後,除了腳本永遠持續而沒有返回任何內容外,同樣的事情發生,而不是發出錯誤。

回答

1

經過一番研究,解決方案(萬一別人運行到類似的問題):

datetime_now = dt.datetime.now()(在本地運行)返回當前系統時間。如果將來與數據庫時間(UTC)相比,讀取失敗或掛起。使用 datetime_now = dt.datetime.utcnow() 可以解決此問題,但如果腳本在雲上執行,則可能不需要此操作。

+1

時鐘同步困難。我建議使用'max_staleness'而不是'read_timestamp'。在此處查看更多詳情https://googlecloudplatform.github.io/google-cloud-python/stable/spanner/database-api.html#google.cloud.spanner.database.Database.snapshot –

+0

謝謝,我會看一下。 –