Datastore - 如何将 Key 放入 Struct ID (golang)?
Datastore - How to put Key inside Struct ID (golang)?
我正在尝试建立多对多关系,所以我有 3 个结构:
type Orders struct {
ID int64
CustomerID string
etc
}
type Products struct {
ID int64
Name string
Description string
etc
}
type OrderDetails struct {
OrderID int64
ProductID string
Quantity int
}
我相信这是正确的方法,但我现在的问题是我不知道如何在不发出两个 client.Put 请求的情况下将数据存储密钥放入结构 ID 中,因为据我所知可以看出,datastore.IncompleteKey("Products", nil)
不会 return 新的键值,直到你把它..
我想有些人会建议使用 key *datastore.Key
而不是 ID int64
,但我更愿意将密钥转换为 ID
如有任何帮助,我们将不胜感激
一种选择是提前分配键,您可以在调用之前在结构中设置键 Client.Put()
。
您可以使用数据存储为您保留的 Client.AllocateIDs()
. You can pass a slice of incomplete keys to it, and you get back a slice of complete datastore.Key
分配 ID(因此保证不会 "give out" 给他人或在保存具有不完整键的实体时使用)。您可以在 Key.ID
字段中访问分配键的数字 ID。
但是在实体中存储数字Key ID是多余的,我觉得这是一种(资源)浪费。每当您加载实体时,例如使用 Client.Get()
, or multiple with Client.GetAll()
,您还可以取回密钥,并且可以在结构 "manually" 中填充数字 ID 作为 post 处理步骤。您还可以将此 post 处理功能包装在一个函数中,只要您从数据存储中获取实体,它就会为您执行此操作。
例如,如果您加载了一个 OrderDetails
实体,其中包含 OrderID
,您可以使用 datastore.IDKey()
为相应的 Order
实体。这样做的例子:
var orderDetails OrderDetails
// Load orderDetails
orderKey := datastore.IDKey("order", orderDetails.OrderID, nil)
// Now you have the key for the Order entity
var order Order
err := client.Get(ctx, orderKey, &order)
这意味着您不应将 "self ID" 存储在实体中,如果数字 ID 已知,您可以构造 datastore.Key
值。
另见相关问题:Can I use AllocateIDs as "string" ? datastore
我正在尝试建立多对多关系,所以我有 3 个结构:
type Orders struct {
ID int64
CustomerID string
etc
}
type Products struct {
ID int64
Name string
Description string
etc
}
type OrderDetails struct {
OrderID int64
ProductID string
Quantity int
}
我相信这是正确的方法,但我现在的问题是我不知道如何在不发出两个 client.Put 请求的情况下将数据存储密钥放入结构 ID 中,因为据我所知可以看出,datastore.IncompleteKey("Products", nil)
不会 return 新的键值,直到你把它..
我想有些人会建议使用 key *datastore.Key
而不是 ID int64
,但我更愿意将密钥转换为 ID
如有任何帮助,我们将不胜感激
一种选择是提前分配键,您可以在调用之前在结构中设置键 Client.Put()
。
您可以使用数据存储为您保留的 Client.AllocateIDs()
. You can pass a slice of incomplete keys to it, and you get back a slice of complete datastore.Key
分配 ID(因此保证不会 "give out" 给他人或在保存具有不完整键的实体时使用)。您可以在 Key.ID
字段中访问分配键的数字 ID。
但是在实体中存储数字Key ID是多余的,我觉得这是一种(资源)浪费。每当您加载实体时,例如使用 Client.Get()
, or multiple with Client.GetAll()
,您还可以取回密钥,并且可以在结构 "manually" 中填充数字 ID 作为 post 处理步骤。您还可以将此 post 处理功能包装在一个函数中,只要您从数据存储中获取实体,它就会为您执行此操作。
例如,如果您加载了一个 OrderDetails
实体,其中包含 OrderID
,您可以使用 datastore.IDKey()
为相应的 Order
实体。这样做的例子:
var orderDetails OrderDetails
// Load orderDetails
orderKey := datastore.IDKey("order", orderDetails.OrderID, nil)
// Now you have the key for the Order entity
var order Order
err := client.Get(ctx, orderKey, &order)
这意味着您不应将 "self ID" 存储在实体中,如果数字 ID 已知,您可以构造 datastore.Key
值。
另见相关问题:Can I use AllocateIDs as "string" ? datastore