2017-10-12 100 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

谢谢,我会看一下。 –