2010-01-27 2 views
1

나는 '다시는 그렇지 않습니다!'라고 생각하는 것을 알고 있지만 Google은 아직 간단한 방법을 제공하지 않았기 때문에 여기 있습니다.GAE에서 데이터 저장소 비우기

나는 괜찮 았는데 큐 기반 솔루션을 사용하고 있습니다 : 모델에서

수입 날짜 가져 *을

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