我在使用帐户的父 key 时保存程序
记录时遇到问题。
此代码失败,并出现错误“无效 key ”(完整信息请参见底部):
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
}
}
最佳答案
问题是当您创建不完整的 key 时:
actKey := datastore.NewIncompleteKey(ctx, "accounts", nil)
用于保存实体:
_, err = datastore.Put(ctx, actKey, &Account{Name: "Chris Olsenio"})
它可以工作,但请注意,如果传递的 key 是不完整的 key (在您的情况下),datastore.Put()
返回由数据存储区生成的新的唯一 key 。您不存储返回的新 key ,但您应该存储!
当您尝试创建并保存"programs"
时实体:
key := datastore.NewIncompleteKey(ctx, "programs", actKey)
datastore.NewIncompleteKey()
期望 nil
父 key ,如果提供,则必须是完整 key (不能不完整)。您通过actKey
这是一个不完整的 key ,因此 "invalid key"
错误消息。
解决方案很简单:存储生成的新 key ,并将新的完整 key 作为父 key 传递:
actKey := datastore.NewIncompleteKey(ctx, "accounts", nil)
actKey, err = datastore.Put(ctx, actKey, &Account{Name: "Chris Olsenio"})
如果err
是 nil
, actKey
现在将是一个完整的 key ,因此在使用 datastore.NewIncompleteKey()
创建其他 key 时可以用作父 key 。或datastore.NewKey()
.
关于google-app-engine - 创建子记录时抛出 Invalid Key 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36762197/