Google app engine 将ID添加到数据存储实体的最佳实践?
当使用不完全键创建实体以便每个记录本身都是唯一的时,在创建时,将键添加回记录以便在结构中传递的最佳方法是什么 例如,使用事务这样的东西(未经测试的代码)是一个好主意吗Google app engine 将ID添加到数据存储实体的最佳实践?,google-app-engine,go,google-cloud-datastore,Google App Engine,Go,Google Cloud Datastore,当使用不完全键创建实体以便每个记录本身都是唯一的时,在创建时,将键添加回记录以便在结构中传递的最佳方法是什么 例如,使用事务这样的东西(未经测试的代码)是一个好主意吗 err = datastore.RunInTransaction(c, func(c appengine.Context) error { incompleteKey := datastore.NewIncompleteKey(c, ENTITY_TYPE, nil) entityKey, err
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)
作为后续行动-我猜这几乎不会失败,因为它几乎不会在同一个未完成密钥上运行?您不需要将MyStruct放入DB两次-这是不必要的开销。作为实体的一部分存储的密钥,可在需要时检索 文档中有一个关于如何存储实体并将其ID用作参考的好例子: 如果要获取实体的键,可以使用以下方法: -(已编辑)请注意,示例中的键和结构是在一个操作中填充的 如果按键查询实体,则您已经知道它的ID
因此,不需要将ID作为单独的属性。如果您想将其与业务逻辑的实体一起传递,您可以创建一个包装器-使用实体结构的interface()进行通用化,或者创建一个强类型化(每个实体结构1个)。我不确定什么是不完整的键,也不确定如何使用没有id的实体,但是您是否知道可以在将实体存储在datastore()中之前为其分配一个id?这能帮上忙吗?谢谢,不过有点不同。不完整密钥是让数据存储立即生成未使用密钥的一种方法,您不是简单地建议运行两次查询(一次获取密钥,另一次用于数据),而不是在创建时插入两次吗?哦,nm,没有意识到返回的是密钥,它填充提供的指针,谢谢:)是的,如果他们强迫我们输入或读取两次以引用一个ID,那将是非常奇怪的:)