Appengine datastore не обновляет несколько записей

1
        votergroup = db.GqlQuery("SELECT * FROM Voter WHERE lastname = :1", 'AGEE')

    for voter in votergroup:
        voter.email = '[email protected]'
    db.put(votergroup)

Вышеприведенный код, похоже, не обновляет записи, как показано в документации приложения. Я также попытался использовать объект запроса безрезультатно. Я знаю, что голосовая группа тянет записи, потому что я подсчитал объект при отладке и показал 10 записей. Фактически, перед db.put я зациклился на элементе voter.email, и кажется, что переменная была установлена. Тем не менее, изменения никогда не возвращают его в db.

Кто-нибудь знает, что я могу делать неправильно?

Теги:
google-app-engine
datastore

2 ответа

3
Лучший ответ

Вам нужно вызвать fetch() в запросе, создаваемом с помощью db.Query(), чтобы он возвращал список объектов. Затем вы можете вызвать put(list_of_entities), чтобы сохранить их все. Это выглядит так:

voters = db.GqlQuery("SELECT * FROM Voter WHERE lastname = :1", 'AGEE').fetch(10)

for voter in voters:
    voter.email = '[email protected]'
db.put(voters)

Если вы не вызываете fetch() в запросе, вы все равно можете перебирать результаты, и RPC хранилища данных будет создан для получения небольших партий по мере необходимости. Вызов put() в запросе ничего не делает, но вы все равно можете выполнять действия над каждым объектом внутри цикла.

voters_query = db.GqlQuery("SELECT * FROM Voter WHERE lastname = :1", 'AGEE')

for voter in voters_query:
    voter.email = '[email protected]'
    voter.put()

Обратите внимание, что это одно хранилище данных для каждого объекта, плюс один вызов для каждой партии, которая повторяется. Намного лучше использовать fetch(), если вы не знаете, сколько элементов будет возвращено.

Вы можете использовать cursors, чтобы разбить на более крупные куски. Я считаю, хотя я не могу найти никаких доказательств, что fetch() имеет ограничение в 1000 сущностей.

  • 0
    Это так странно - так что документация appengine не так? Проверьте это: code.google.com/appengine/docs/python/datastore/… Примерно на полпути вы увидите пример кода, который я имитировал, если users.get_current_user (): user_pets = db.GqlQuery ("SELECT * FROM Pet") ГДЕ владелец =: 1 ", users.get_current_user ()) для питомца в user_pets: pet.spayed_or_neutered = True db.put (user_pets)
  • 0
    Это похоже на опечатку. Позже в разделе GqlQuery ( code.google.com/appengine/docs/python/datastore/… ) они используют fetch() перед итерацией по results .
Показать ещё 8 комментариев
1

Попробуйте это вместо:

votergroup = db.GqlQuery("SELECT * FROM Voter WHERE lastname = :1", 'AGEE')

for voter in votergroup:
    voter.email = '[email protected]'
    voter.put()

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

  • 0
    put() берет список сущностей и сохраняет их все: code.google.com/appengine/docs/python/datastore/…
  • 0
    @ Джейсон Холл: Я исправлен. В прошлый раз я попробовал что-то подобное, это просто не сработало, и я не смог найти его в документах.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню