我在 go-appengine 的数据存储中使用命名空间,大致如下:func getThing() *Thing { nctx := appengine.Namespace(ctx, "whatever") thing := Thing{} key, err := datastore.Get(nctx, key, &thing) if err != nil { return nil, err } return thing, nil}够简单了吧?不幸的是,如果事实证明如果 nctx 的命名空间与键的命名空间不匹配,它无论如何都会很高兴地获取该对象。AFAICT,没有办法手动获取密钥的“命名空间”字段以手动验证它。这对我们的应用很重要,因为我们有来自 Web 客户端的密钥,在某些极端情况下,这些密钥可能与错误的命名空间相关联。OTOH,如果我使用的键作为祖先进行查询Thing,数据存储(适当地)返回错误,因为祖先的命名空间与上下文(形式query namespace is 'bar' but ancestor namespace is 'foo')的命名空间不匹配。我是否遗漏了一些关于数据存储提取/查询和命名空间的预期约束,或者这听起来像是一个错误?
1 回答
鸿蒙传说
TA贡献1865条经验 获得超7个赞
我假设您正在传递编码的密钥,而不仅仅是它们的 ID?如果您使用创建键,datastore.NewKey
则传递给它的上下文将设置键的命名空间(除非还有父项,在这种情况下将使用其命名空间)。
就意图而言,此行为等效于 python API - 在 上设置不同的命名空间时,可以获取从 urlsafe 字符串创建的密钥namespace_mananger
,但如果您仅通过指定创建密钥,则使用当前设置的命名空间种类和身份。
不过,为命名空间设置一个 getter 会很好,所以您至少可以在反序列化后进行验证...
- 1 回答
- 0 关注
- 211 浏览
添加回答
举报
0/150
提交
取消