更改AppEngine NDB密钥

时间:2018-07-01 23:56:22

标签: google-app-engine app-engine-ndb google-app-engine-python

我有一个游戏,我(愚蠢地)使db键等于用户登录电子邮件。几年前我做了这个,所以现在有很多用户。一些用户要求更改我的游戏的电子邮件登录。有没有简单的方法来更改密钥?据我所知,我需要使用新电子邮件创建一个新条目并复制所有数据,然后删除旧数据库条目。这是用户模型,但后来我有了其他模型,例如他们所涉及的每个游戏的模型,都存储了用户密钥,所以我也必须循环所有这些模型并换成新密钥。

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

通过我知道他们从电子邮件中获取的密钥而不进行搜索,确实可以有效地拉出db条目,但是事后看来,

2 个答案:

答案 0 :(得分:3)

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

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

您现在应该撕掉乐队,并从该模型进行模式迁移。

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

您应该使用任务队列执行类似的操作,然后您不必担心进程超时:

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

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

答案 1 :(得分:0)

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