更改 Appengine NDB 密钥

Change appengine ndb key

我有一个游戏,我(愚蠢地)将数据库密钥设置为用户登录电子邮件。几年前我就这样做了,所以现在我有很多用户。一些用户要求更改他们的游戏登录邮箱。有没有简单的方法来更改密钥?据我所知,我需要用新电子邮件创建一个新条目并复制所有数据,然后删除旧的数据库条目。这是用户模型,但我还有其他模型,比如他们参与的每个游戏都有一个模型,它存储用户密钥,所以我必须循环遍历所有这些模型并换出新密钥。

在开始之前,我想看看是否还有其他人有更好的计划。可能有多个模型存储该旧用户密钥,因此我也担心进程超时。

它确实可以有效地提取数据库条目,因为我从他们的电子邮件中知道密钥而无需进行搜索,但事后看来它非常不灵活

这实际上就是为什么您不使用用户的电子邮件作为他们的密钥的原因。使用 ndb 默认随机生成的密钥 ID。

您指的效率是不必查询用户的电子邮件来检索用户 ID。但这只会在用户登录或查看某人帐户时从您的管理屏幕发生一次。

你现在应该撕掉绷带并从这个模型中迁移模式。

  1. 创建一个新的用户模型(即 UsersV2)并将现有的用户模型克隆到其中以生成新的 ID。
  2. 在所有引用它的模型上添加一个重复字段 user_v2 = ndb.KeyProperty(UsersV2) 并用新键填充它。
  3. 删除旧用户模型

你应该使用任务队列来做这样的事情,这样你就不用担心进程超时了:

https://cloud.google.com/appengine/articles/update_schema

或者,如果您决定在每次用户更改电子邮件时执行此级联更新,您可以为该用户设置类似的 update_schema 任务。

我最终添加了一个新的 属性 到我的用户模型和 运行 一个爬虫以将字符串键(电子邮件)复制到那个新的 属性。我更改了我的代码搜索 属性 而不是关键字符串以获取用户项目。我的大多数用户仍然拥有与他们的电子邮件相同的密钥,但我可以安全地忽略它们,就好像该字符串毫无意义一样。我现在可以轻松更改用户电子邮件而无需重新记录,并且我的其他具有指向这些用户密钥的指针的模型可以保持不变。