无法从使用IncompleteKey()创建的数据存储中检索实体

时间:2019-05-17 12:13:45

标签: go google-cloud-datastore

我正在使用“ 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添加新实体。但是,在每种情况下(即使对于数据存储区中已经存在的实体),“ keys”变量始终获得nil值。

keys, err := s.DataLayer.GetAll(ctx, query, &tExp)

因此,将在数据存储区中创建具有相同键值的多个实体。我无法找出如何在golang中解决此问题。

注意:-数据存储区中的实体具有结构

[“数据存储区在调用IncompleteKey方法时自动生成的名称/ ID”,键,值]。

1 个答案:

答案 0 :(得分:1)

首先,如果要获取特定实体,则应使用Get而不是GetAll,因为Get是高度一致的,而GetAll不是。

第二,由于您要使用不完整的密钥进行看跌期权,因此您不会对仅添加到数据存储区的新实体产生冲突。看来您想同时使用transaction来获取和放置具有传递到函数中的完整密钥的实体。