【发布时间】:2018-08-22 09:58:05
【问题描述】:
我正在尝试使用 golang 将项目放入 Google 数据存储区。
虽然我总是遇到datastore: invalid key 错误,但无法弄清楚这里出了什么问题。我正在使用"cloud.google.com/go/datastore" 包。
首先,我尝试获取父节点的密钥(不确定这是不是正确的方法,但我最终得到了 datastore.Key 和 parentKey)。
现在使用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
}
我用NameKey 和IncompleteKey 都试过了,但都没有运气。
我显然在这里遗漏了一些东西,但无法弄清楚它是什么以及如何将我的项目作为另一个节点的子节点写入数据存储区。
【问题讨论】:
-
我看到了,但这里不适用,他试图给他的不完整的钥匙写一个孩子,我不能用不完整的钥匙本身写项目。
-
是 parent[0] 本身的完整密钥吗?
-
您需要在某些时候打印出 newKey 以查看传递给 Put() 的内容。
-
据我所知,@JimMorrison 看起来不错。
newKey: /Inventory,5634161670881280/Supplier,supplier-01/InventoryItem,0。然而,我确实意识到,命名空间不是在newKey上设置的,只是在parentKey上。这可能是问题吗?我的理解是父键会为新实体隐式设置命名空间,但也许我必须明确地这样做?
标签: go google-cloud-datastore google-cloud-firestore