Я использую «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), я могу создать сущность и увидеть ее в реальном хранилище данных.
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, а если ключи равны нулю, я хочу вызвать datastore.Put, чтобы добавить новую сущность.Однако в каждом случае (даже для уже существующих объектов в хранилище данных) переменная «keys» всегда получает нулевое значение.
keys, err := s.DataLayer.GetAll(ctx, query, &tExp)
Поэтому в хранилище данных создается несколько сущностей с одинаковым значением ключа.Я не могу выяснить, как я могу исправить эту проблему в golang.
Примечание: - в объектах хранилища данных есть структура
["Имя / ID, автоматически генерируемые Datastore при вызове метода IncompleteKey", Ключ, значение].