Опорожнение хранилища данных в GAE - PullRequest
1 голос
/ 27 января 2010

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

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

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

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

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

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

1 Ответ

1 голос
/ 28 января 2010

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

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