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