GAE Go - 如何将GetMulti与不存在的实体密钥一起使用?

时间:2013-03-06 16:17:24

标签: google-app-engine google-cloud-datastore go

我发现自己需要对某些实体存在的键数组进行GetMulti操作,但有些实体不存在。

下面的我当前代码会返回错误(datastore: no such entity)。

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

那我该怎么做呢?我使用“获取或插入”方法,但没有一个。

3 个答案:

答案 0 :(得分:15)

在这种情况下,

GetMulti可以返回appengine.MultiError。循环遍历并查找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
    }
}

答案 1 :(得分:0)

我知道这个话题已经用了几天多了,但是我想用 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
  }
}

答案 2 :(得分: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...)
}