12

GetMulti一部のエンティティが存在するが、存在しないキーの配列を使用して操作を実行する必要があることに気付きました。

以下の私の現在のコードは、エラー(datastore: no such entity)を返します。

err := datastore.GetMulti(c, keys, infos)

では、どうすればこれを行うことができますか?「getまたはinsert」メソッドを使用しますが、ありません。

4

3 に答える 3

19

GetMulti can return a appengine.MultiError in this case. Loop through that and look for datastore.ErrNoSuchEntity. For example:

if err := datastore.GetMulti(c, keys, dst); err != nil {
    if me, ok := err.(appengine.MultiError); ok {
        for i, merr := range me {
            if merr == datastore.ErrNoSuchEntity {
                // keys[i] is missing
            }
        }
    } else {
        return err
    }
}
于 2013-03-06T19:38:31.197 に答える
2

このトピックが数日以上続くことは知っていますが、type switchを使用して別の方法を投稿したいと思います。

if err := datastore.GetMulti(c, keys, dst); err != nil {
  switch errt := err.(type) {
  case appengine.MultiError:
    for ix, e := range errt {
      if e == datastore.ErrNoSuchEntity {
        // keys[ix] not found
      } else if e != nil {
        // keys[ix] have error "e"
      }
    }
  default:
    // datastore returned an error that is not a multi-error
  }
}
于 2018-07-12T18:54:38.040 に答える
0

別のユースケースを表示するために私の答えを投げ込むと思いました。以下は任意の数のキーを受け取り、すべての有効なキーのみを返します。

// Validate keys
var validKeys []*ds.Key
if err := c.DB.GetMulti(ctx, tempKeys, dst); err != nil {
    if me, ok := err.(ds.MultiError); ok {
        for i, merr := range me {
            if merr == ds.ErrNoSuchEntity {
                continue
            }
            validKeys = append(validKeys, tempKeys[i])
        }
    } else {
        return "", err
    }
} else {
    // All tempKeys are valid
    validKeys = append(validKeys, tempKeys...)
}
于 2021-08-08T13:45:02.287 に答える