我知道你在想什么,“别再那样了!”,但现在我们来看看,因为谷歌还没有提供一个更简单的方法。在
我一直在使用基于队列的解决方案,效果很好:
导入日期时间 从模型导入*
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实体时遇到了困难,最后总是有一些遗留的实体。我认为是因为它包含引用属性:
^{pr2}$我尝试过删除与这些实体类型相关的索引,但这没有任何区别。在
如有任何建议,将不胜感激。在
我不认为试图删除引用了仍然存在的实体的实体确实是一个问题,但是您可以通过重新编写任务来串行删除实体而不是并行删除这些实体来排除这一问题:
相关问题 更多 >
编程相关推荐