Google Code предлагается на следующих языках: English – Español – 日本語 – 한국어 – Português – Pусский – 中文(简体) – 中文(繁體)
У каждого объекта в хранилище данных есть ключ, т.е. идентификатор, уникальный среди всех объектов приложения. Ключ включает ряд компонентов: путь, указывающий отношение "родитель-потомок" между двумя объектами, тип объекта, а также название, присвоенное объекту приложением, или числовой идентификатор, присвоенный хранилищем данных.
Каждый объект является объектом определенного типа, т.е. входит в группу объектов, которые могут быть возвращены запросом. В отличие от строк в таблице, два объекта одного типа необязательно должны обладать одинаковыми свойствами, хотя приложение может наложить такое ограничение на модель данных. API хранилища данных использует имя подкласса Model (или Expando) в качестве названия типа.
Например, в классе определена модель для типа "Story":
class Story(db.Model): title = db.StringProperty() author = db.StringProperty()
У каждого объекта есть идентификатор. Чтобы приложение присвоило собственный идентификатор, который будет использован в ключе, задайте аргумент key_name в конструкторе экземпляра (значение str):
s = Story(key_name="xzy123")
Значение key_name хранится в виде строки Unicode (в которой значения str преобразуются в текст ASCII). Значение key_name не может начинаться с цифры и иметь форму __*__ (начинаться и заканчиваться двойным подчеркиванием). Если приложение использует предоставленные пользователем данные в качестве названий ключей объектов в хранилище данных (например, адрес электронной почты), приложение должно проверить и скорректировать значение, например, добавив в начало известную строку, чтобы удовлетворить этим требованиям.
Если значение key_name не задано, то объекту присваивается числовой идентификатор при первом сохранении в хранилище данных.
s2 = Story() # s2 does not have a name or an ID. s2.put() # s2 is given an ID by the datastore.
После создания объекта невозможно изменить его идентификатор или название.
Совет. Названия и идентификаторы ключей не являются значениями свойств. Однако можно выполнять ограниченный набор запросов по ключам, ссылаясь на специальное название свойства __key__. Если все объекты обладают одним типом и родителем, фильтры и порядки сортировки можно применять к идентификаторам и названиям ключей. См. статью Запросы по ключам
Каждый объект входит в группу объектов, т.е. в набор из одного или нескольких объектов, которыми можно управлять в одной транзакции. Отношения групп объектов указывают App Engine, что необходимо хранить несколько объектов в одной части распределенной сети. Транзакция задает операции в хранилище данных для группы объектов. Все операции применяются ко всей группе или не применяются вообще, если выполнение транзакции не удалось.
Когда приложение создает объект, оно может указать, что другой объект является родителем нового объекта, используя аргумент parent в конструкторе класса Model. Указание родителя для нового объекта включает новый объект в группу объектов, в которую входит родительский объект.
Объект без родителя является корневым объектом. Объект, который является родителем другого объекта, также может иметь родителя. Последовательность родительских объектов от данного объекта до корневого составляет путь для объекта, участники которого являются родителями объекта. Родитель объекта определяется во время создания объекта и не может быть изменен впоследствии.
Все объекты с данным корневым объектом в качестве родителя находятся в одной группе объектов. Все объекты в группе хранятся в одном узле хранилища данных. Одна транзакция может изменить несколько объектов в одной группе или добавить новые объекты в группу, включив родителя нового объекта в группу.
Подробнее о транзакциях рассказано в статье Транзакции.
При удалении объекта, являющегося родителем другого объекта, потомок не удаляется. К потомку можно по-прежнему осуществлять доступ с помощью полного значения Key или пути.
Можно создать объект с путем родителя без предварительного создания родительского объекта. Чтобы сделать это, задайте значение Key для родителя с помощью типа и названия ключа, затем используйте его в качестве родителя нового объекта. Все объекты с одним корневым объектом входят в одну группу объектов вне зависимости от того, представляет путь существующий объект или нет.
Советы по использованию групп объектов:
Полный ключ объекта, содержащий путь, тип и название или числовой идентификатор, уникален и привязан к объекту. Полный ключ присваивается объекту во время создания в хранилище данных, и впоследствии его компоненты не могут быть изменены.
Ключи двух различных объектов могут иметь одни и те же компоненты, но хотя бы один из них должен различаться. Например, два объекта могут иметь один тип и название, если у них разные родители. Аналогично два объекта могут иметь одного родителя (или не иметь его вообще) и название, если они разных типов.
Приложение не должно полагаться на то, что числовые идентификаторы задаются в порядке возрастания по мере создания объектов. Обычно это так, но это не гарантировано.