我们目前正计划合并我们的两个App Engine项目,并希望将所有数据从欧盟数据存储区移至美国数据存储区。
数据将使用Google的导出/导入工具(https://cloud.google.com/datastore/docs/export-import-entities)进行移动。但是我们不确定现有的数据存储如何处理具有自动生成的ID的插入实体。我们是否可以确定以后没有存储的实体使用现有ID并因此覆盖现有实体? (所有复制的实体尚不存在于数据存储接收器中)
在文档中注明:
“导入操作不会为实体分配新的ID。导入操作会使用 导出时已存在并覆盖任何现有实体 具有相同的ID。在导入过程中,ID将在导入期间保留。 实体导入的时间。此功能可防止ID 如果在导入过程中启用了写操作,则会与新实体发生冲突 正在运行。”
“这些ID在导入实体时被保留了”,这是否意味着它们也被阻止以供将来分配新的自动生成的ID?
示例
在Datastore1(来源,EU)中,我有一个带有自动生成的Long-Id的Entity。可以说我保存了10,000个此类实体,然后删除了1,000个此类实体。我可以肯定知道的是,如果我将一个新实体(即到目前为止没有设置ID)保存在datastore1中,那么它将获得一个从未使用过的ID。因此,该ID将不同于9,000个现有实体,也不同于1,000个已删除实体。
现在,我将所有实体导出到Cloudstorage(gcloud数据存储区导出),然后将它们从Cloudstorage导入到其他数据存储区Datastore2(gcloud数据存储区导入)。当然,这将在Datastore2中创建9,000个给定种类的实体(以前在Datastore2中不存在该种类)。
我现在的问题是:当我在Datastore2中存储1个(或多个)新实体时,它会始终获得一个新ID还是会发生冲突?
id冲突有两种方式。
类型A:新实体会覆盖现有9,000个复制的实体之一。 类型B:新实体获得的ID等于Datastore1中删除的1,000个实体之一的ID(显然,在Datastore2中,从来没有一个实体具有这些ID之一,但我想知道导出/导入是否会阻止这些ID以及ID)
有人知道A型还是B型会在某个时候发生吗?
答案 0 :(得分:1)
当您执行从数据库1到数据库2的导入时,所有ID都会被保留,然后再将实体放入新数据库中(有关保留ID的更多信息,请参见REST documentation)。
这意味着数据库2不会分配从数据库1导入的ID(不会发生类型A)。
但是,导入将不保留其不知道的实体(即已删除的实体)的ID。这些ID 可以在数据库2中重复使用。(类型B会发生。)