go - 无法从使用 IncompleteKey() 创建的数据存储中检索实体
问题描述
我正在使用“cloud.google.com/go/datastore”来存储、更新、检索数据存储中的实体。我创建的结构是 -
type TExp struct {
Key string `json:"key" datastore:"key,noindex"`
Value string `json:"value" datastore:"value,noindex"`
}
type service struct {
DataLayer *datastore.Client
}
当我使用 datastore.IncompleteKey("TExp", nil) 为此创建 id 时,我能够创建实体并可以在真实数据存储中看到它。
func (s service)addTExp(ctx context.Context, request interface{}) (interface{}, error) {
req := request.(*TExp)
var tExp []TExp
var tExp2 TExp
tExp2.Key = req.Key
tExp2.Value = req.Value
query := datastore.NewQuery("TExp").Filter("key =", req.Key).Namespace("AdLive")
keys, err := s.DataLayer.GetAll(ctx, query, &tExp)
if err != nil {
log.Errorf(ctx,"Error occurred while checking existence of key in kind")
}
if keys == nil {
log.Infof(ctx,"Keys: %v ", keys)
k := datastore.IncompleteKey("TExp", nil)
k.Namespace = "AdLive"
k.Kind = "TExp"
if _, err := s.DataLayer.Put(ctx, k, &tExp2); err != nil {
return nil, marvin.NewJSONStatusResponse(
"could not add TExp in DS",
http.StatusBadRequest,
)}
}
return "OK",nil
}
问题是在创建任何实体之前,我想确保该数据存储中不存在任何具有相同键值的实体。为此,首先我尝试使用 GetAll 方法检查是否存在,而不是如果键为 nil,我想调用 datastore.Put 来添加新实体。但是,在每种情况下(即使对于 Datastore 中已经存在的实体),“keys”变量总是得到 nil 值。
keys, err := s.DataLayer.GetAll(ctx, query, &tExp)
因此,在数据存储中使用相同的键值创建了多个实体。我无法找出如何在 golang 中解决此问题。
注意:- 在数据存储实体中具有结构
["Datastore 在调用 IncompleteKey 方法时自动生成的名称/ID", Key, Value]。
解决方案
推荐阅读
- json - 如何在 Spark Scala 中读取嵌套 JSON?
- azure-gov - 有没有办法提前知道使用哪个广告进行身份验证?
- java - Log4j2 高亮模式在文本编辑器中不起作用?
- java - 转发具有完全相同 json 正文的请求
- bash - 如何在条件命令中立即退出?
- android - 使用 Retrofit 2 和 Logging Interceptor 进行身份验证 1 小时后令牌过期
- pandas - 获取熊猫数据框列表条目中的数字条目
- python-3.x - 根据玩家的移动在 pygame 中移动平铺地图
- python - 如何将一列数据(文本)包装成 8 列并且可以以 8 列样式放入 excel 中?
- wso2 - 我们可以使用 WSO2 DSS 来使用 Apache DRILL