我正在尝试使用GAE / Go在名称空间MyNameSpace
中存储数据存储区记录,但下面的代码无效。
import (
"cloud.google.com/go/datastore"
"github.com/gin-gonic/gin"
"google.golang.org/appengine"
)
func Save(c *gin.Context, list []MyStruct) ([]MyStruct, error) {
r := c.Request
ctx := appengine.NewContext(r)
ctx_with_namespace, err := appengine.Namespace(ctx, "MyNameSpace")
if err != nil {
return nil, err
}
client, err := datastore.NewClient(ctx_with_namespace, "MyProject")
if err != nil {
return nil, err
}
var keyList []*datastore.Key
for _, v := range list {
key := datastore.NameKey("MyStruct", v.ColA, nil)
keyList = append(keyList, key)
}
_, err = client.PutMulti(ctx_with_namespace, keyList, list)
return list,nil
}
此代码在默认命名空间中创建记录,而不是MyNameSpace
。
cloud.google.com/go/datastore
是否会忽略命名空间设置?
答案 0 :(得分:2)
我找到了this document
2016年11月8日
对数据存储区域进行重大更改:上下文不再保留名称空间; 相反,您必须明确设置密钥的命名空间。此外,关键功能 已被更改并重命名。
已删除WithNamespace函数。在中指定命名空间 查询,使用Query.Namespace方法:
q := datastore.NewQuery("Kind").Namespace("ns")
导出Key的所有字段。这意味着您可以使用struct literal构造任何Key:
k := &Key{Kind: "Kind", ID: 37, Namespace: "ns"}
我意识到我应该明确设置命名空间,但它非常不方便。我迁移到使用google.golang.org/appengine/datastore