我发现自己需要对GetMulti
一组键进行操作,其中一些实体存在,但有些不存在。
我当前的代码如下,返回一个错误(datastore: no such entity
)。
err := datastore.GetMulti(c, keys, infos)
那么我该怎么做呢?我会使用“获取或插入”方法,但没有。
我发现自己需要对GetMulti
一组键进行操作,其中一些实体存在,但有些不存在。
我当前的代码如下,返回一个错误(datastore: no such entity
)。
err := datastore.GetMulti(c, keys, infos)
那么我该怎么做呢?我会使用“获取或插入”方法,但没有。
appengine.MultiError
在这种情况下,GetMulti 可以返回 a 。循环通过它并寻找datastore.ErrNoSuchEntity
. 例如:
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...)
}