当使用 IncompleteKey 创建实体以便每条记录本身都是唯一的时,将键添加回记录以便它可以在创建时在结构中传递的最佳方法是什么?
例如,使用事务处理(未经测试的代码)是个好主意吗?
err = datastore.RunInTransaction(c, func(c appengine.Context) error {
incompleteKey := datastore.NewIncompleteKey(c, ENTITY_TYPE, nil)
entityKey, err := datastore.Put(c, incompleteKey, &MyStruct)
if(err != nil) {
return err
}
MyStruct.SelfID = entityKey.IntID()
_, err = datastore.Put(c, entityKey, &MyStruct)
return err
}, nil)
作为后续——我猜这应该几乎永远不会失败,因为它几乎永远不会对同一个 incompleteKey 进行操作?
最佳答案
您不需要将 MyStruct 放入数据库两次 - 这是不必要的开销。作为实体的一部分存储的 key ,可以在需要时检索。
文档中有一个关于如何存储实体并将其 ID 用作引用的很好示例:https://cloud.google.com/appengine/docs/go/datastore/entities#Go_Ancestor_paths
当您想要获取实体的键时,您可以使用以下方法来实现: https://cloud.google.com/appengine/docs/go/datastore/queries#Go_Retrieving_results -(已编辑)请注意示例中的键和结构是在 1 个操作中填充的。
如果您通过键查询一个实体,您已经知道它的 ID。
因此不需要将 ID 作为单独的属性。如果您想将它与实体一起传递给您的业务逻辑,您可以创建一个包装器 - 可以使用实体结构的 interface() 进行泛化,也可以使用强类型(每个实体结构 1 个)。
关于google-app-engine - 将 ID 添加到数据存储实体的最佳做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32764351/