Как ввести необходимые свойства в GAE - PullRequest
5 голосов
/ 16 февраля 2011

Я изменил свой объект, чтобы иметь новое обязательное свойство в v2.Когда я пытаюсь получить объект v1 из хранилища данных, я получаю BadValueError, потому что v1 не имеет обязательного свойства.Как лучше всего ввести новые обязательные свойства в существующие данные

Ответы [ 2 ]

6 голосов
/ 17 февраля 2011

Я бы решил эту проблему, используя библиотеку mapreduce .

Сначала зарегистрируйте преобразователь в mapreduce.yaml:

mapreduce:
- name: fixing required property
  mapper:
    input_reader: mapreduce.input_readers.DatastoreInputReader
    handler: your handler
    params:
    - name: entity_kind
      default: main.ModelV2

, а затем определите processфункция для изменения сущностей:

from mapreduce import operation as op
def process(entity):
 if not entity.newproperty :
    entity.newproperty = None
 yield op.db.Put(entity)

Если вы имеете дело с относительно небольшим числом сущностей, вы можете избежать mapreduce, изменяющего напрямую ваши сущности примерно так:

entities = ModelV2.all()
for entity in entities :
  if not entity.newproperty :
    entity.newproperty = None
    entity.put()
3 голосов
/ 16 февраля 2011

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

API-интерфейс mapEduce AppEngine должен сделать это довольно просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...