【问题标题】:Google Datastore invalid key errorGoogle Datastore 无效密钥错误
【发布时间】:2018-08-22 09:58:05
【问题描述】:

我正在尝试使用 golang 将项目放入 Google 数据存储区。

虽然我总是遇到datastore: invalid key 错误,但无法弄清楚这里出了什么问题。我正在使用"cloud.google.com/go/datastore" 包。

首先,我尝试获取父节点的密钥(不确定这是不是正确的方法,但我最终得到了 datastore.KeyparentKey)。

现在使用parentKey 作为父项创建新密钥,然后尝试使用newKey 对项目进行put 时,我收到invalid key 错误消息。

q := datastore.NewQuery("Supplier")
              .Namespace("inventory")
              .Filter("Name =", "supplier-01")
              .Limit(1)
var s []supplier
parentKey, err := client.GetAll(ctx, q, &s)
if err != nil || len(parentKey) < 1 {
    fmt.Printf("could not find parent key: %v\n", err)
    return
}
newKey := datastore.IncompleteKey("InventoryItem", parentKey[0])
//newKey := datastore.NameKey("InventoryItem", item.Name, parentKey[0])
if _, err := client.Put(ctx, newKey, &item); err != nil {
    fmt.Printf("could not save item: %v\n", err)
    return
}

我用NameKeyIncompleteKey 都试过了,但都没有运气。

我显然在这里遗漏了一些东西,但无法弄清楚它是什么以及如何将我的项目作为另一个节点的子节点写入数据存储区。

【问题讨论】:

  • 我看到了,但这里不适用,他试图给他的不完整的钥匙写一个孩子,我不能用不完整的钥匙本身写项目。
  • 是 parent[0] 本身的完整密钥吗?
  • 您需要在某些时候打印出 newKey 以查看传递给 Put() 的内容。
  • 据我所知,@JimMorrison 看起来不错。 newKey: /Inventory,5634161670881280/Supplier,supplier-01/InventoryItem,0。然而,我确实意识到,命名空间不是在newKey 上设置的,只是在parentKey 上。这可能是问题吗?我的理解是父键会为新实体隐式设置命名空间,但也许我必须明确地这样做?

标签: go google-cloud-datastore google-cloud-firestore


【解决方案1】:

汤米,你在评论中指出了这一点。您需要在新密钥上设置命名空间。我在Cloud Datastore Go documentation 中看不到隐式执行此操作的方法,因此您必须在调用 Put() 之前执行 newKey.namespace = parentKey.namespace。

【讨论】:

  • 谢谢吉姆,从文档来看,我认为这要么是通过父命名空间隐式完成,要么暴露一个适当的方法来设置新键上的命名空间,就像你对查询等所做的那样。
猜你喜欢
  • 2018-02-14
  • 2020-10-13
  • 2014-04-21
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多