创建子记录时抛出无效密钥消息

时间:2016-04-21 07:09:41

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

在使用帐户的父密钥时,我在保存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
        }
    }

1 个答案:

答案 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"})

如果errnil,则actKey现在将成为完整密钥,因此在使用datastore.NewIncompleteKey()或{{1}创建其他密钥时可以将其用作父密钥}。