【发布时间】:2015-02-23 21:03:42
【问题描述】:
我正在开发一个 Go 应用程序,其中我有一个具有属性的实体,该属性包含一个标识令牌,该令牌是一个随机的字节串。我将此属性存储为 ByteString,并且在我的开发环境中,我已经能够使用以下形式的过滤器查询此属性:
// token is a []byte
idTok := datastore.ByteString(token)
q := ds.NewQuery("Entity").Filter("IDToken =", idTok)
var entities []Entity
keys, err := q.GetAll(c, &entities)
但不幸的是,当作为模块部署到 GAE 时,此查询返回错误:datastore: bad query filter value type: unsupported datastore value type: datastore.ByteString,这令人困惑,因为我认为 ByteString 类型的目的是能够索引 500 字节以下的更短数量的二进制数据.
我首先根据这个 SO 问题的第二个答案切换到使用 ByteString 类型:Golang - Appengine datastore filter query with []byte comparison
【问题讨论】:
-
你能确认
len(token)不大于500吗?另外你使用的是什么版本的 Go SDK? 1.2 还是 1.4 测试版?如果是后者,在您的app.yaml配置文件中是否指定了api_version: go1.4beta? -
是的,我自己生成令牌,它们有 64 个字节长。当数据库中根本没有实体时,实际上甚至会发生错误,因此它似乎与任何实体的上下文无关。我只有指定为
api_version: go1的api 版本。您知道版本之间的差异记录在哪里吗? -
我在这里找到了针对 GAE Go 运行时环境的版本:code.google.com/p/googleappengine/wiki/SdkForGoReleaseNotes 版本 1.9.11 中的状态为
ByteString添加了支持,并附注:“添加ByteString类型以允许短的可索引字节片。”我通过调用appengine.ServerSoftware()确认我的代码正在Google App Engine/1.9.18上运行。我不确定如何查看应用运行的 Go 版本,但似乎 Go 版本应该与通过 API 提供的应用引擎功能正交
标签: google-app-engine go google-cloud-datastore