2010-07-15 1 views
2

Привет, я прочитал несколько сообщений по этой теме, скажу, что хочу удалить каждый объект для данного класса db.model, такого как LinkRating2, есть ли способ удалить его при запуске с помощью простой команды? Я думал, что я помню, как я видел это где-то, например, - четкое хранилище данных, в противном случае я пытался использовать различные методы в консоли sdk, но все, похоже, были сбой памяти, поскольку файл вечно только загружается и запускается. Я не думаю, что есть какие-либо память осталось около lol. Итак, что было бы лучшим методом кода для удаления всего объекта?Как легко удалить весь класс db.model в Google App Engine?

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) 

ответ

2

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

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

Я не стал положить его в петлю, а , как пытаться удалить все субъектов в один присест, вероятно, стоит хороший шанс превышения 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

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

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

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

+0

У меня есть около 100k сущности я пытался все сразу, ударить слишком много для удаления ошибки api, поэтому я поставил в цикле, как показано ниже, какова нормальная скорость удаления объектов, которые выглядят смехотворно медленными? все еще работает – user291071

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

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

Этот вопрос уже задавался: Delete all data for a kind in Google App Engine

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

+0

Я нашел страницу, чтобы очистить хранилище данных, поскольку это будет просто быстрее :) http://code.google.com/appengine/docs/python/tools/devserver.html – user291071

+0

Если это работает для чего вам нужно, , Просто помните, что он удалит все, а не только определенный класс, как упоминается в исходном сообщении. – Cuga

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