google-app-engine - 创建子记录时抛出 Invalid Key 消息

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

我在使用帐户的父 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"})

如果errnil , actKey现在将是一个完整的 key ,因此在使用 datastore.NewIncompleteKey() 创建其他 key 时可以用作父 key 。或datastore.NewKey() .

关于google-app-engine - 创建子记录时抛出 Invalid Key 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36762197/

相关文章:

google-app-engine - 在带有 Scala 2.8 的 Google App Engine 上使用 Lift 2.1

go - UNIX域套接字上的net.Listen()在Windows Server 2008上失败

parsing - 如何将分隔字符串解析为子字符串片段?

python - GAE NDB 访问结构化重复列表中的子实例(字段)

python - 人类可读的时间表语法,如我的应用程序中的功能?

ssl - 使用 ZeroSSL 为谷歌应用引擎创建 SSL 证书并让我们加密

go - 将数据从 Datastore 传递到 http.Writer

google-app-engine - Google 数据存储 - Blob 或文本

javascript - 如何在django应用程序中实现ajax?

谷歌容器集群作为配置