首页 > 解决方案 > Google App Engine:在数据存储之间迁移数据

问题描述

我们目前正计划合并我们的两个 App Engine 项目,并希望将所有数据从欧盟数据存储移动到美国数据存储。

数据将使用 Google 的导出/导入工具 ( https://cloud.google.com/datastore/docs/export-import-entities ) 移动。但我们不确定现有数据存储如何处理插入具有自动生成 ID 的实体。我们能否确定之后存储的任何实体都不会使用现有 ID 从而覆盖现有实体?(数据存储接收器中尚不存在所有复制的实体)

在文档中指出:

“导入不会为实体分配新的 ID。导入使用导出时存在的 ID 并覆盖具有相同 ID 的任何现有实体。在导入期间,在导入实体期间保留 ID。如果在导入运行时启用写入,此功能可防止 ID 与新实体发生冲突。”

“在导入实体期间保留 ID”是否意味着它们也被阻止以供将来分配新的自动生成的 ID?

例子

在 Datastore1(原产地,欧盟)中,我有一个带有自动生成的 Long-Id 的实体。假设我保存了 10,000 个这样的实体,然后我删除了其中的 1,000 个。我可以肯定的是,如果我在 datastore1 中保存一个新实体(即目前没有设置 Id),那么它将获得一个以前从未使用过的 Id。因此,Id 将不同于现有的 9,000 个实体,也不同于已删除的 1,000 个实体。

现在我将所有实体导出到 Cloudstorage(gcloud 数据存储导出),然后将它们从 Cloudstorage 导入到另一个数据存储 Datastore2(gcloud 数据存储导入)。这当然会在 Datastore2 中创建 9,000 个给定类型的实体(该类型之前在 Datastore2 中不存在)。

我现在的问题是:当我在 Datastore2 中存储 1 个(或多个)新实体时,它会始终获得一个新的 ID,还是会发生冲突?

id-collision有两种方式。

A 类:新实体覆盖现有的 9,000 个复制实体之一。类型 B:一个新实体的 ID 等于 Datastore1 中 1,000 个已删除实体之一的 ID(显然,在 Datastore2 中,从来没有一个实体具有这些 ID 之一,但我想知道导出/导入是否会阻止这些身份证)

有人知道 A 型或 B 型是否会在某个时候发生吗?

标签: google-app-enginegoogle-cloud-datastore

解决方案


当您执行从数据库 1 到数据库 2 的导入时,在将实体放入新数据库之前保留所有 ID(有关保留 ID 的更多信息,请参阅REST 文档)。

这意味着数据库 2 不会分配从数据库 1 导入的 ID(类型 A 不会发生)。

但是,导入不会保留它不知道的实体的 ID(即已删除的实体)。这些 ID可以在数据库 2 中重复使用。(类型 B 会发生)。


推荐阅读