Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 将ID添加到数据存储实体的最佳实践?_Google App Engine_Go_Google Cloud Datastore - Fatal编程技术网

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,那将是非常奇怪的:)