Как легко удалить весь класс db.model в Google App Engine? - PullRequest
2 голосов
/ 15 июля 2010

Здравствуйте, я прочитал несколько постов на эту тему. Допустим, я хочу удалить каждый объект для данного класса db.model, например LinkRating2, есть ли способ удалить его при запуске с помощью простой команды? Я думал, что помню, что где-то видел, например, --clear datastore ?, в противном случае я пробовал различные методы в консоли SDK, но все, кажется, сбой памяти, поскольку файл занимает вечно только для загрузки и запуска, я не думаю, что есть какие-либо памяти осталось о лол. Итак, что будет лучшим методом кода для удаления всей сущности?

class LinkRating2(db.Model):
    user = db.StringProperty()
    link = db.StringProperty()
    rating2 = db.FloatProperty()

пробовал это, но это очень медленно

results2 = LinkRating2.all()
results = results2.fetch(500)

while results:
    db.delete(results)
    results = results2.fetch(500)

Ответы [ 4 ]

2 голосов
/ 16 июля 2010

есть ли способ удалить его при запуске с помощью простой команды?Я думал, что помню это где-то, например, --clear хранилище данных?

Если вы говорите о сервере разработки, то да.dev_appserver.py --clear_datastore myapp запустит вас с новым хранилищем данных.Это лучший вариант, когда вы работаете локально.

Я не потрудился поместить его в цикл while, поскольку попытка удалить все объекты за один раз, вероятно, имеет хорошие шансы напревышение 30-секундного срока.Вам нужно будет делать это до тех пор, пока все сущности не исчезнут.

Если вы хотите уничтожить каждую сущность данного типа в производстве, это хороший повод для использования remote_api вместо написания веб-обработчика, чтобы обойти 30-секундный крайний срок и уменьшить вероятность повторного запуска вашего кода entitypocalypse.

И последнее: если вы хотите удалить некоторые объекты, ноВы не хотите загружать определение модели, вы можете использовать API хранилища данных низкого уровня:

from google.appengine.api import datastore

kind = 'LinkRating2'
batch_size = 1000

query = datastore.Query(kind=kind, keys_only=True)
results = query.Get(batch_size)
while results:
  print "Deleting %d %s entities" % (batch_size, kind)
  datastore.Delete(results)
  results = query.Get(batch_size)
2 голосов
/ 15 июля 2010

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

results = db.Query(LinkRating2, keys_only=True).fetch(1000)
if len(results) > 0:
    db.delete(results)

Я не потрудился поместить его в цикл while, поскольку попытка удалить все сущности за один раз, вероятно, имеет хороший шанс превысить 30-секундный срок. Вам нужно будет сделать это, пока все сущности не исчезнут.

0 голосов
/ 16 июля 2010

Флаг --clear-datastore удалит все данные из базы данных, а не только определенного класса, как вам кажется.

Этот вопрос уже задавался: Удалить все данные для вида в Google App Engine

Я думаю, что этот ответ даст вам то, что вы хотите. Он удаляет элементы по их ключам, что должно быть намного быстрее: Удалить все данные для вида в Google App Engine

0 голосов
/ 16 июля 2010
results = db.Query(Final, keys_only=True).fetch(1000)
while len(results) > 0:
    db.delete(results)
    results = db.Query(Final, keys_only=True).fetch(1000)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...