2017-10-12 18 views
1

下記のコードを使用して、タイムスタンプ付きのGoogle Spannerテーブルから読み取ろうとしています。タイムスタンプでスパナを読み取るとエラーが発生する

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 

私は、 "スナップショット" コールにタイムスタンプを設定した場合、これは以下のエラーメッセージが返されます、(StatusCode.DEADLINE_EXCEEDEDで終了RPCの< _Rendezvous:

grpc._channel._Rendezvousをデッドライン超過)>

私が "[...]。snapshot()"を呼び出すと、テーブルが正しく読み込まれます。

これはスクリプトやインストールの問題でエラーですか?

編集:ちょうど私はpython spanner APIの最新バージョンではなかった気づいた。 0.26から0.28に更新した後も、エラーが発生するのではなく、何かを返さずにスクリプトが永遠に続くことを除いて、同じことが起こります。いくつかの研究の後

答えて

1

、溶液(場合には他の誰かが同様の問題に実行されます):

datetime_now = dt.datetime.now()(ローカルで実行)現在のシステム時刻を返します。これが将来データベース時間(UTC)と比較される場合、読み取りは失敗するかハングします。 datetime_now = dt.datetime.utcnow() を使用すると、この問題は解決されますが、スクリプトがクラウド上で実行されている場合は必要ではない可能性があります。

+1

クロックの同期は困難です。 'read_timestamp'の代わりに' max_staleness'を使うことをお勧めします。詳細はこちらhttps://googlecloudplatform.github.io/google-cloud-python/stable/spanner/database-api.html#google.cloud.spanner.database.Database.snapshot –

+0

ありがとうございます。 。 –

関連する問題