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
であることを確認すること。しないと他の要因でエラーが出た時に危ない。