2011-12-18 3 views
3

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

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

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

Так the queries in this article являются:

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

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') 

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

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

+0

Похоже, вы ищете волшебный рецепт, чтобы сделать хранилище данных HR, как M/S. Существует не один - вам просто нужно рассмотреть, какие последствия устаревших данных находятся в каждом из ваших запросов, и реструктурировать, если это проблема. –

+0

Привет, Ник, спасибо, что нашли время ответить на мои вопросы. Я не пытаюсь получить волшебный рецепт для HR, чтобы действовать как M/S, хотя я думаю, что понимаю, почему вы так думаете. То, что я пытаюсь получить, это фрагменты кода, используя эти примеры, чтобы действительно иметь возможность кодировать запросы, совместимые с HR (примечание: без устаревших данных). В течение последних нескольких лет я работал с M/S, и теперь я хочу работать с HR, но я понятия не имею, как это сделать. Документация на веб-сайте GAE очень минимальна с фактическими примерами кода. Я выбираю пример djangoforms, потому что я многому использую и могу сосредоточиться на новом коде. – reallife

+0

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

ответ

3

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

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

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

+1

Ты просто избил меня. Хотя «Гостевая книга» не является ключом предка. Это [вид ключа] (http://code.google.com/appengine/docs/python/datastore/keyclass.html#Key_from_path). –

+0

Привет, спасибо, что нашли время, чтобы ответить на мои вопросы. Я очень ценю это.Единственное, что я хочу знать, как переписать эти запросы, о которых я говорил выше, хорошо работает с высоким хранилищем данных репликации (извините за то, что он недостаточно ясен, но это означает, что у меня есть доступ к последним данным и не устаревшим данным) , Я перечитал документ, который вы связывали, фактически уже более 5 раз, и до сих пор не получаю его, как переписать мой код. Я думаю, что я понимаю (часть) теорию, почему следует использовать ее, а также устаревшие данные по сравнению с последними данными, но не как это сделать с реальным кодом. – reallife

+0

Все дело в том, что вам не нужно переписывать свой код. –

1

Изменения в использовании РЛР не в том, как делаются запросы, но в каких гарантиях сделаны какие данные вы возвращаете. Пример, который вы даете:

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

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

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

В ответ на ваш последующий вопрос «Гостевая книга» - это имя объекта.

+0

Также спасибо за попытку ответить на мои вопросы! Я очень ценю это. Большая часть того, что я только что прокомментировал в ответ Даниила, также относится к вашему ответу. Я все же хотел бы перевести запросы, упомянутые в моем вопросе, на запросы хранилища данных, которые будут получать последние данные (давайте забудем, если это необходимо в случае гостевой книги или нет). --- Также вы упомянули: «получение объекта по ключу напрямую» и «вы можете избежать этой проблемы с запросами, разместив все объекты, которые должны быть согласованы в одной группе объектов». -> как вы это делаете, примеры кода, пожалуйста? – reallife

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

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