Изменить appengine ключ ndb - PullRequest
0 голосов
/ 02 июля 2018

У меня есть игра, в которой я (по глупости) сделал ключ db равным электронному логину пользователя. Я сделал это несколько лет назад, поэтому сейчас у меня немало пользователей. Некоторые пользователи попросили изменить свой электронный адрес для входа в мою игру. Есть ли простой способ поменять ключ? Насколько я могу судить, мне нужно сделать новую запись с новым письмом, скопировать все данные и удалить старую запись в БД. Это пользовательская модель, но затем у меня есть другие модели, например, по одной для каждой игры, в которой они участвуют, в которой хранится пользовательский ключ, так что мне нужно было бы выполнить все эти циклы и поменять их на новый ключ.

Прежде чем приступить к этому, я хотел посмотреть, есть ли у кого-то другой план получше. Там может быть несколько моделей, хранящих этот старый пользовательский ключ, поэтому я также беспокоюсь о том, что процесс может быть задержан.

Это позволяет эффективно извлекать запись из БД, поскольку я знаю ключ из их электронного письма, не выполняя поиск, но это довольно негибко в ретроспективе

Ответы [ 2 ]

0 голосов
/ 08 июля 2018

В итоге я добавил новое свойство в свою модель пользователя и запустил сканер, чтобы скопировать строковый ключ (адрес электронной почты) в это новое свойство. Я изменил свой код поиска по этому свойству, а не по ключевой строке, чтобы получить элемент пользователя. У большинства моих пользователей все еще есть ключи, равные их электронной почте, но я могу смело игнорировать их, как будто строка не имеет смысла. Теперь я могу легко изменить электронную почту пользователя, не создавая новые записи, и мои другие модели, имеющие указатели на эти пользовательские ключи, могут остаться без изменений.

0 голосов
/ 02 июля 2018

Именно поэтому вы не используете электронную почту пользователя в качестве ключа. Использовать стандартные сгенерированные ndb идентификаторы ключей.

Эффективность, на которую вы ссылаетесь, не требует запроса электронной почты пользователя для получения идентификатора пользователя. Но это происходит только один раз при входе пользователя в систему или с экрана вашего администратора при просмотре чьей-то учетной записи.

Вы должны сорвать банду прямо сейчас и выполнить миграцию схемы от этой модели.

  1. Создайте новую модель пользователя (т. Е. UsersV2) и клонируйте в нее свою существующую модель пользователя, чтобы сгенерировать новые идентификаторы.
  2. На всех моделях, которые ссылаются на него, добавьте дублирующее поле user_v2 = ndb.KeyProperty(UsersV2) и заполните его новым ключом.
  3. Удалить устаревшую модель пользователя

Вы должны использовать очередь задач, чтобы сделать что-то подобное, и тогда вам не придется беспокоиться о времени ожидания процесса:

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

В качестве альтернативы, если вы решили выполнять это каскадное обновление каждый раз, когда пользователь изменяет электронную почту, вы можете настроить аналогичную задачу update_schema только для этого пользователя.

...