带时间戳的扳手读取失败

时间:2017-10-12 13:09:42

标签: python google-cloud-platform google-cloud-spanner

我正在尝试使用下面的代码从带有时间戳的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

如果我在“快照”调用中设置了时间戳,则会返回以下错误消息:

  

grpc._channel._Rendezvous:< _以(StatusCode.DEADLINE_EXCEEDED,截止日期超过)>终止的RPC的退出行为>

虽然,如果我只是调用“[...] .snapshot()”,表格会被正确读取。

这是我的脚本中的错误还是安装问题?

编辑:刚刚注意到我没有使用最新版本的python扳手API。在从0.26更新到0.28之后,同样的事情发生了,除了脚本永远不会返回任何内容,而不是引发错误。

1 个答案:

答案 0 :(得分:1)

经过一些研究,解决方案(以防其他人遇到类似问题):

datetime_now = dt.datetime.now()(在本地运行时)返回当前系统时间。如果将来与数据库时间(UTC)相比,则读取失败或挂起。运用 datetime_now = dt.datetime.utcnow() 修复了这个问题,但如果脚本在云上执行则可能不需要这样做。