Не удается удалить объекты хранилища данных в google-app-engine - PullRequest
0 голосов
/ 09 июня 2018

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

Попробуйте 1:

results = myDS().query().fetch()
for res in results:
    res.delete()

Попробуйте 2:

results = myDS().query().fetch()
ndb.delete_multi(results)

В обоих случаях происходит сбой, и я получаю сообщение об ошибке:

Сервер обнаружил ошибку и не смог выполнить ваш запрос.

Есть идеи почему?

1 Ответ

0 голосов
/ 13 июня 2018

В results, полученном из ваших запросов, у вас есть действительные сущности.

При первой попытке, чтобы удалить сущность, вам нужно вызвать .delete() на ключе сущности, а не на самой сущности.см. также Удаление объектов :

res.key.delete()

Аналогично, во 2-й попытке вам необходимо передать ключи сущностей, а не сущностей, в ndb.delete_multi(), см. также Использование пакетаоперации :

ndb.delete_multi([r.key for r in results])

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

keys = myDS().query().fetch(keys_only=True)
for key in keys:
    key.delete()

keys = myDS().query().fetch(keys_only=True, limit=500)  # up to 500 keys at a time
ndb.delete_multi(keys)
...