带有时间戳的扳手读取失败

spanner read with timestamp fails

我正在尝试使用下面的代码从 google Spanner table 读取带有时间戳的内容。

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

如果我在 "snapshot" 调用中设置时间戳,这 returns 下面的错误消息:

grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with (StatusCode.DEADLINE_EXCEEDED, Deadline Exceeded)>

而如果我只是调用“[...].snapshot()”,则 table 会被正确读取。

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

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

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

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