【问题标题】:Google App Engine - ByteString query failsGoogle App Engine - ByteString 查询失败
【发布时间】: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


【解决方案1】:

大约一周后,此问题自行解决。由于它只出现在模块环境中,我猜他们的某些代码没有更新以支持 ByteString 类型,现在是。现在效果很好!

【讨论】:

    猜你喜欢
    • 2011-07-11
    • 2015-04-19
    • 2014-05-12
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    相关资源
    最近更新 更多