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

Getting Invalid Key message thrown when creating child records

我在使用帐户父密钥时保存 programs 记录时遇到问题。

此代码失败并出现错误 "invalid 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
        }
    }

问题是当您创建一个不完整的密钥时:

actKey := datastore.NewIncompleteKey(ctx, "accounts", nil)

您用来保存实体的:

_, err = datastore.Put(ctx, actKey, &Account{Name: "Chris Olsenio"})

它有效,但请注意,如果传递的密钥是不完整的密钥(在您的情况下),datastore.Put() returns 由数据存储生成的新的唯一密钥。您不存储返回的新密钥,但您应该!

当您尝试创建和保存 "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"})

如果 errnilactKey 现在将是一个完整的密钥,因此在使用 datastore.NewIncompleteKey() 或 [= 创建其他密钥时可以用作父密钥24=].