Go
GAE
GoogleAppEngine
datastore
gcp

DataStoreのEntityの存在チェック

Entityの存在チェック方法

クエリで確認


func isExistsUser(g *goon.Goon, identifier string) (bool, error) {
    key := g.Key(&User{Identifier: identifier})
    var users []User
    q := datastore.NewQuery("User").Filter("__key__ =", key).Limit(1).KeysOnly()
    if _, err := g.GetAll(q, &users); err != nil {
        return false, err
    }
    if len(users) == 0 {
        return false, nil
    }
    return true, nil
}

クエリを組み立てて探す

Getで探す

↑のクエリでの検索は、トランザクション内の場合に「Only ancestor queries are allowed inside transactions」と言われて実行出来ない。
その場合はGetで探す

user := &User{Identifier: identifier}
err := g.Get(user)
if err != nil {
  if err != datastore.ErrNoSuchEntity {
    return nil, err
  } else {
    if _, err := g.Put(wallet); err != nil {
      return nil, err
  }
}
return wallet, nil

エラーチェックだけではなく、エラーがErrNoSuchEntityであることを確認すること。しないと他の要因でエラーが出た時に危ない。