3

Я видел решение этого вопроса, используя App Engine's older DB Datastore API, но не могу найти решение при использовании новичка NDB API.Как обновить схему модели NDB

Каков наилучший способ добавления поддержки миграции, так что я могу перейти от старой версии схемы к новой версии. Было бы лучше написать сценарий миграции и как это будет работать?

Нечто подобное миграции схемы, как это в (Обратите внимание, что образец находится в NDB):

class Picture(ndb.Model): 
    author = ndb.StringProperty() 
    png_data = ndb.BlobProperty() 
    name = ndb.StringProperty(default='') # Unique name. 

обновленному один, как это:

class Picture(ndb.Model): 
    author = ndb.StringProperty() 
    png_data = ndb.BlobProperty() 
    name = ndb.StringProperty(default='') # Unique name. 

    num_votes = ndb.IntegerProperty(default=0) 
    avg_rating = ndb.FloatProperty(default=0) 

Большое спасибо!

+0

Решение для моделей NDB в значительной степени похоже на решение, описанное здесь: [Обновление схемы модели NDB] (http://romannowicki.readthedocs.io/en/latest/gae/updating-ndb-model -schema.html) – manRo

ответ

5

Насколько я знаю, NDB не имеет встроенной поддержки миграции схемы. Мы обрабатываем миграцию схемы таким образом:

  • Добавить свойство NDB integer, называемое schema_version, каждой используемой модели. Это будет версия схемы, которая была активной при сохранении модели.
  • Добавьте атрибут класса SCHEMA_VERSION к каждой модели, представляющей текущую версию кода схемы. По умолчанию оно равно 0, и мы это делаем, когда добавляем/удаляем/изменяем свойства NDB на модели.
  • Попросите наши модели применить метод updateSchema, который может просматривать сохраненные и текущие версии и выполнять соответствующие миграции.
  • Во время загрузки объектов мы проверяем, устарела ли версия схемы сущности, которую мы загрузили. Если это так, мы вызываем updateSchema, чтобы исправить сущность, прежде чем мы вернем ее из нашего слоя данных. Затем мы устанавливаем schema_version на значение SCHEMA_VERSION.

Этот подход означает, что мы обновляем схему по требованию. Если мы столкнемся с ситуацией, когда мы действительно хотим, чтобы все объекты определенного типа были обновлены сейчас, мы пишем операцию map/reduce, которая загружает и сохраняет каждую сущность этого типа; миграция схемы происходит автоматически как часть этого процесса без простоя.

Теперь это работает, если вы не имеете дело с моделями с модельными суперклассами, чьи схемы также могут измениться. Чтобы решить эту проблему, вам нужно собрать различные значения SCHEMA_VERSION по иерархии классов, когда вы придумаете значение для хранения в schema_version. Мы собираем их, просто суммируя их, чтобы придумать официальную «версию текущей схемы» объекта, но возможны другие способы сделать это.

+0

Спасибо! Я попытаюсь реализовать это самостоятельно –

+0

Хорошее решение Owen. Я ценю, что вы пишете это. –

Смежные вопросы