2010-01-27 3 views
1

Я знаю, о чем вы думаете: «О, это не так!», Но здесь мы с тех пор, как Google еще не предоставил более простой метод.Опорожнение хранилища данных в GAE

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

импорт DateTime из моделей импорта *

DELETABLE_MODELS = [Alpha, Beta, AlphaBeta] 

def initiate_purge(): 
    for e in config.DELETABLE_MODELS: 
     deferred.defer(delete_entities, e, 'purging', _queue = 'purging') 

class NotEmptyException(Exception): pass 

def delete_entities(e, queue): 
    try: 
     q = e.all(keys_only=True) 
     db.delete(q.fetch(200)) 
     ct = q.count(1) 
     if ct > 0: 
      raise NotEmptyException('there are still entities to be deleted') 
     else: 
      logging.info('processing %s completed' % queue) 
    except Exception, err: 
     deferred.defer(delete_entities, e, then, queue, _queue = queue) 
     logging.info('processing %s deferred: %s' % (queue, err)) 

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

Это бьет из-за удара обновления в браузере в течение 10 минут.

Тем не менее, у меня возникли проблемы с удалением объектов AlphaBeta, в конце концов осталось несколько левых. Я думаю, потому что он содержит Эталонные свойства:

class AlphaBeta(db.Model): 
    alpha = db.ReferenceProperty(Alpha, required=True, collection_name='betas') 
    beta = db.ReferenceProperty(Beta, required=True, collection_name='alphas') 

Я попытался удалить индексы, относящиеся к этим типам сущностей, но это не имеет никакого значения.

Любой совет будет оценен, пожалуйста.

+0

- это "delete_entities_before" опечатка? Возможно, вы пытаетесь отложить вызов функции, которая не существует? – geoffspear

+0

Да, это было, спасибо. Это то, что происходит, когда вы упрощаете код. – user132262

+0

Правда ли, что AlphaBeta действительно означает EntityOrigin? –

ответ

1

Я не верю, что попытка удалить объект, имеющий ссылки на все еще существующие сущности, действительно является проблемой, но вы всегда можете это исправить, переписывая свою задачу, чтобы удалить объекты поочередно, а не параллельно :

def initiate_purge(): 
    deferred.defer(delete_entities, Alpha, _queue = 'purging') 

def delete_entities(e): 
    try: 
     q = e.all(keys_only=True) 
     db.delete(q.fetch(200)) 
     ct = q.count(1) 
     if ct > 0: 
      raise NotEmptyException('there are still entities to be deleted') 
     else: 
      logging.info('processing completed') 
      if type(e) == Alpha: 
       logging.info('spawning delete Beta task.') 
       deferred.defer(delete_entities, Beta, _queue = 'purging') 
      else if type(e) == Beta: 
       logging.info('spawning delete AlphaBeta task.') 
       deferred.defer(delete_entities, AlphaBeta, _queue = 'purging') 
    except Exception, err: 
     deferred.defer(delete_entities, e, _queue = 'purging') 
     logging.info('processing deferred: %s' % (err)) 
+0

О, я понимаю, что вы имеете в виду о параллельной игре. Я дам этот подход. – user132262

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