Как использовать High Replication Datastore - PullRequest
3 голосов
/ 18 декабря 2011

Хорошо, я посмотрел видео и прочитал статьи в документации App Engine (включая Использование хранилища данных с высокой репликацией ). Однако я до сих пор полностью запутался в его практическом использовании. Я понимаю преимущества (из видео), и они звучат великолепно. Но мне не хватает нескольких практических примеров. В Интернете есть много примеров master / slave, но очень мало иллюстрирующих (с надлежащей документацией) хранилище данных с высокой репликацией. Пример кода гостевой книги, использованный в статье Использование хранилища данных с высокой репликацией , иллюстрирует ключ предка, добавляя новую функциональность, которой нет в предыдущем примере кода гостевой книги (кажется, вы можете изменить гостевую книгу). Это только добавляет путаницы.

Я часто использую djangoforms в GAE, и мне было интересно, может ли кто-нибудь помочь мне перевести все эти запросы в запросы, совместимые с хранилищем данных с высокой репликацией (давайте на минутку забудем о том, что не все запросы обязательно должны быть запросы с высокой репликацией, совместимые с хранилищем данных, и сосредоточимся на самом примере.

ОБНОВЛЕНИЕ: с запросами, совместимыми с хранилищем данных с высокой репликацией, я имею в виду запросы, которые всегда возвращают последние данные, а не потенциальные устаревшие данные. Использование групп сущностей, кажется, является подходящим способом, но, как уже упоминалось ранее, у меня не так много практических примеров кода того, как это сделать, поэтому я ищу именно это!

Итак запросы в этой статье :

Основной повторяющийся запрос в этой статье:

query = db.GqlQuery("SELECT * FROM Item ORDER BY name")

который мы переведем на:

query = Item.all().order('name')  // datastore request

проверка формы происходит следующим образом:

data = ItemForm(data=self.request.POST)
if data.is_valid():
    # Save the data, and redirect to the view page
    entity = data.save(commit=False)
    entity.added_by = users.get_current_user()
    entity.put()  // datastore request

и получение последней записи из хранилища данных для заполнения формы происходит следующим образом:

id = int(self.request.get('id'))
item = Item.get(db.Key.from_path('Item', id))  // datastore request
data = ItemForm(data=self.request.POST, instance=item)

Итак, что мне / нам нужно сделать, чтобы все эти запросы хранилища данных были совместимы с хранилищем данных с высокой репликацией?

И последнее, что мне тоже не ясно. Использование ключей-предков влияет ли это на модель в хранилище данных. Например, в примере кода гостевой книги они используют:

def guestbook_key(guestbook_name=None):
  return db.Key.from_path('Guestbook', guestbook_name or 'default_guestbook')

Однако «Гостевая книга» не существует в модели , так как вы можете использовать «db.Key.from_path» для этого и почему это будет работать? Изменяет ли это способ хранения данных в хранилище данных, которое мне необходимо учитывать при извлечении данных (например, добавляет ли оно еще одно поле, которое я должен исключить из отображения при использовании djangoforms)?

Как я уже говорил, меня это сильно смущает, и ваша помощь очень ценится!

Ответы [ 2 ]

3 голосов
/ 18 декабря 2011

Я не уверен, почему вы думаете, что вам нужно изменить свои запросы вообще. Документация, на которую вы ссылаетесь, четко гласит:

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

Смысл этой страницы в том, чтобы просто сказать, что запросы могут быть не синхронизированы, если вы не используете группы сущностей. Ваш окончательный фрагмент кода является лишь примером этого - строка «Гостевая книга» является ключом предка. Я не понимаю, почему вы думаете, что это должно существовать в модели. Еще раз, это не изменилось по сравнению с хранилищем данных, не относящимся к HR - всегда был случай, когда ключи создаются из путей, которые могут состоять из произвольных строк. Возможно, вам нужно перечитать документацию по группам сущностей и ключам .

1 голос
/ 18 декабря 2011

Изменения в использовании HRD связаны не с тем, как выполняются запросы, а с тем, какие гарантии даются о том, какие данные вы получите. Пример, который вы приводите:

query = db.GqlQuery("SELECT * FROM Item ORDER BY name")

будет работать и в HRD. Подвох (в основном) заключается в том, что этот тип запроса (с использованием этого синтаксиса или формы Item.all ()) может возвращать объекты немного устаревшими. Это, вероятно, не имеет большого значения для гостевой книги.

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

В ответ на ваш дополнительный вопрос «Гостевая книга» - это имя организации.

...