Как хранятся классы моделей Google App Engine? - PullRequest
5 голосов
/ 17 ноября 2010

Я сомневаюсь, как хранятся объекты.Скажем, у меня есть класс, определенный как:

class SomeEntity(db.Model):
    some_number = db.IntegerProperty(required=True)

    def calculate_something(self):
        return self.some_number * 2

Я думаю, что единственное, что хранится в хранилище данных, это имя / значение / тип some_number вместе с полностью определенным именем класса (SomeEntity).Однако я не наткнулся на какую-либо информацию, которая подтверждает это.

1) Кто-нибудь может это подтвердить?

Я хотел бы подтвердить, что я могу изменить (и добавить / удалить) методы без какого-либо влияния на сохраняемые данные.

2) Кроме того, что произойдет с существующими объектами, если я добавлю новое свойство в класс (и что, если это свойство имеет required=true)?

Ответы [ 2 ]

10 голосов
/ 17 ноября 2010

Сущности хранятся в хранилище данных в представлении protobuf (включая его ключ - который включает в себя ваш идентификатор приложения и вид сущности). В статье Life of Datastore Write больше говорится о представлении сущностей и о том, как они записываются в хранилище данных. Ознакомьтесь с остальными статьями этой серии для получения более подробной информации.

1) Методы не имеют отношения к данным, хранящимся в вашей сущности, поэтому вы можете добавлять / удалять / изменять их, не влияя на представление ваших данных.

2) Хранилище данных не имеет схемы (в отличие от типовой базы данных SQL). Изменение Model никак не влияет на данные в хранилище данных. При извлечении существующего объекта, если в нем отсутствует поле required, возникает ошибка. В качестве альтернативы, если вы не сделаете это обязательным и предоставите значение по умолчанию, то для отсутствующего поля будет использоваться значение по умолчанию.

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

3 голосов
/ 17 ноября 2010

Они хранятся в виде буферов протокола. О некоторых деталях можно прочитать в статье « Как хранятся сущности и индексы ».

Вы можете увидеть, что на самом деле хранится с:

db.model_to_protobuf(your_entity)

Безопасно добавлять / удалять методы, просто будьте осторожны с перезаписью встроенных методов.

Включить значение по умолчанию, если вы добавляете необходимое свойство. Существующие сущности не будут обновлены, пока вы не переустановите сущность.

...