GetMulti
一部のエンティティが存在するが、存在しないキーの配列を使用して操作を実行する必要があることに気付きました。
以下の私の現在のコードは、エラー(datastore: no such entity
)を返します。
err := datastore.GetMulti(c, keys, infos)
では、どうすればこれを行うことができますか?「getまたはinsert」メソッドを使用しますが、ありません。
GetMulti
一部のエンティティが存在するが、存在しないキーの配列を使用して操作を実行する必要があることに気付きました。
以下の私の現在のコードは、エラー(datastore: no such entity
)を返します。
err := datastore.GetMulti(c, keys, infos)
では、どうすればこれを行うことができますか?「getまたはinsert」メソッドを使用しますが、ありません。
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
}
}
このトピックが数日以上続くことは知っていますが、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
}
}
別のユースケースを表示するために私の答えを投げ込むと思いました。以下は任意の数のキーを受け取り、すべての有効なキーのみを返します。
// 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...)
}