Какой самый простой способ удалить все данные из моего магазина? - PullRequest
4 голосов
/ 08 сентября 2011

Каков ваш лучший способ удалить все BLOB-объекты из Blobstore?Я использую Python.

У меня довольно много блобов, и я хотел бы удалить их все.В настоящее время я делаю следующее:

class deleteBlobs(webapp.RequestHandler): 
    def get(self): 
        all = blobstore.BlobInfo.all(); 
        more = (all.count()>0) 
        blobstore.delete(all); 
        if more: 
            taskqueue.add(url='/deleteBlobs',method='GET'); 

, который, кажется, использует тонны процессора и (насколько я могу судить) не делает ничего полезного.

Ответы [ 2 ]

7 голосов
/ 06 ноября 2011

Я использую этот подход:

import datetime
import logging
import re
import urllib

from google.appengine.ext import blobstore
from google.appengine.ext import db
from google.appengine.ext import webapp

from google.appengine.ext.webapp import blobstore_handlers
from google.appengine.ext.webapp import util
from google.appengine.ext.webapp import template

from google.appengine.api import taskqueue
from google.appengine.api import users


class IndexHandler(webapp.RequestHandler):
    def get(self):
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.out.write('Hello. Blobstore is being purged.\n\n')
        try:
            query = blobstore.BlobInfo.all()

            index = 0

            to_delete = []
            blobs = query.fetch(400)
            if len(blobs) > 0:
                for blob in blobs:
                    blob.delete()
                    index += 1

            hour = datetime.datetime.now().time().hour
            minute = datetime.datetime.now().time().minute
            second = datetime.datetime.now().time().second
            self.response.out.write(str(index) + ' items deleted at ' + str(hour) + ':' + str(minute) + ':' + str(second))
            if index == 400:
                self.redirect("/purge")

        except Exception, e:
            self.response.out.write('Error is: ' + repr(e) + '\n')
            pass

APP = webapp.WSGIApplication(
    [
        ('/purge', IndexHandler),
    ],
    debug=True)

def main():
    util.run_wsgi_app(APP)


if __name__ == '__main__':
    main()

Мой опыт показывает, что более 400 BLOB-объектов одновременно потерпят неудачу, поэтому я позволяю ему перезагружаться для каждых 400. Я пробовал blobstore.delete(query.fetch(400)), но я думаю,ошибка прямо сейчас.Ничего не произошло, и ничего не было удалено.

4 голосов
/ 09 сентября 2011

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

Вместо этого вы должны получать результаты в пакетах, используя fetch, и удалять каждый пакет.Используйте курсоры для установки следующего пакета и избегайте необходимости повторения запроса по всем «захороненным» записям перед нахождением первого действующего, а в идеале удаляйте несколько пакетов для каждой задачи, используя таймер, чтобы определить, когда следует остановиться и выполнить цепочкуследующая задача.

...