Невозможно получить сущность из хранилища данных, созданного с помощью IncompleteKey () - PullRequest
1 голос
/ 17 мая 2019

Я использую «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", Ключ, значение].

1 Ответ

1 голос
/ 18 мая 2019

Во-первых, если вы хотите извлечь определенную сущность, вы должны использовать Get вместо GetAll, поскольку Get строго согласован, а GetAll - нет.

Во-вторых, поскольку вы делаете пут с неполным ключом, у вас никогда не будет конфликта с новой сущностью, которую вы только добавляете в свое хранилище данных. Кажется, вы хотите использовать транзакцию для получения и размещения сущности с полным ключом, который передается в вашу функцию.

...