我在我的应用程序中引入了命名空间,但是我遇到了一个问题,我现有的一个查询执行以下操作,以确定给定密钥是否存在实体。
// c is of type context.Context
c, _ = appengine.Namespace(c, "name")
k := datastore.NewKey(c, "Kind", "", id, nil)
q := datastore.NewQuery("Kind").Filter("__key__ =", k).KeysOnly()
keys, err := q.GetAll(c, nil)
执行此命令并将命名空间应用于上下文时,它会返回以下错误:
datastore_v3 API error 1: __key__ filter namespace is but query namespace is db
我可以使用Get
查询,但我根本不需要实际检索实体。此外,仅限密钥查询是免费的!
更新
在我引入命名空间后,似乎所有查询都失败了。该文件未提及对指数的任何特殊处理:
https://cloud.google.com/appengine/docs/go/multitenancy/multitenancy
答案 0 :(得分:0)
“默认情况下,数据存储区使用当前命名空间进行数据存储区请求.API在创建它们时将此当前命名空间应用于datastore.Key对象。因此,如果应用程序以序列化形式存储Key对象,则需要小心,因为命名空间保留在那些序列化中。“
将名称空间与数据存储区一起使用
https://cloud.google.com/appengine/docs/go/multitenancy/multitenancy#Go_Using_namespaces_with_the_Datastore