在使用帐户的父密钥时,我在保存programs
条记录方面遇到了问题。
此代码失败,错误为“无效密钥”(请参阅底部完整):
key := datastore.NewIncompleteKey(ctx, "programs", actKey)
_, err = datastore.Put(ctx, key, &Program{Name: names[i]})
通过:
key := datastore.NewIncompleteKey(ctx, "programs", nil)
_, err = datastore.Put(ctx, key, &Program{Name: names[i]})
完整代码:
// insert test account
actKey := datastore.NewIncompleteKey(ctx, "accounts", nil)
_, err = datastore.Put(ctx, actKey, &Account{Name: "Chris Olsenio"})
if err != nil {
log.Errorf(ctx, "Insert test account %v", err.Error())
c.AbortWithError(http.StatusInternalServerError, err)
return
}
var names = []string {"Low Impact", "Running"}
for i := 0; i < len(names); i++ {
key := datastore.NewIncompleteKey(ctx, "programs", actKey)
_, err = datastore.Put(ctx, key, &Program{Name: names[i]})
if err != nil {
log.Errorf(ctx, "Insert test programs %v", err.Error())
c.AbortWithError(http.StatusInternalServerError, err)
return
}
}
答案 0 :(得分:2)
问题是当你创建一个不完整的密钥时:
actKey := datastore.NewIncompleteKey(ctx, "accounts", nil)
用于保存实体的内容:
_, err = datastore.Put(ctx, actKey, &Account{Name: "Chris Olsenio"})
它有效,但请注意,如果传递的密钥是不完整的密钥(在您的情况下),datastore.Put()
将返回由数据存储区生成的新的唯一密钥。您不存储返回的新密钥,但您应该!
当您尝试创建并保存"programs"
个实体时:
key := datastore.NewIncompleteKey(ctx, "programs", actKey)
datastore.NewIncompleteKey()
要求nil
父密钥,如果提供,则必须是完整密钥(不能不完整)。您传递actKey
这是一个不完整的密钥,因此会出现"invalid key"
错误消息。
解决方案很简单:存储生成的新密钥,并将新的完整密钥作为父密钥传递:
actKey := datastore.NewIncompleteKey(ctx, "accounts", nil)
actKey, err = datastore.Put(ctx, actKey, &Account{Name: "Chris Olsenio"})
如果err
为nil
,则actKey
现在将成为完整密钥,因此在使用datastore.NewIncompleteKey()
或{{1}创建其他密钥时可以将其用作父密钥}。