【发布时间】:2010-01-27 14:52:36
【问题描述】:
我知道你在想什么,“哦,不要再这样了!”,但我们在这里,因为 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')
我曾尝试删除与这些实体类型相关的索引,但这并没有任何区别。
任何建议都将不胜感激。
【问题讨论】:
-
“delete_entities_before”是错字吗?您是否有可能试图推迟对不存在的函数的调用?
-
是的,谢谢。简化代码时会发生这种情况。
-
AlphaBeta 真的是指 EntityOrigin 吗?
-
是的,另一个错字。对不起。我希望现在一切都修好了。
标签: python google-app-engine google-cloud-datastore