Appengine datastore не обновляет несколько записей - PullRequest
1 голос
/ 24 августа 2010
        votergroup = db.GqlQuery("SELECT * FROM Voter WHERE lastname = :1", 'AGEE')

    for voter in votergroup:
        voter.email = 'testemail@testemail.com'
    db.put(votergroup)

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

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

Ответы [ 2 ]

3 голосов
/ 24 августа 2010

Вам нужно вызвать 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 = 'testemail@testemail.com'
db.put(voters)

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

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

for voter in voters_query:
    voter.email = 'testemail@testemail.com'
    voter.put()

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

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

1 голос
/ 24 августа 2010

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

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

for voter in votergroup:
    voter.email = 'testemail@testemail.com'
    voter.put()

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

...