Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 清空GAE中的数据存储_Python_Google App Engine_Google Cloud Datastore - Fatal编程技术网

Python 清空GAE中的数据存储

Python 清空GAE中的数据存储,python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,我知道你在想什么,‘哦,别再那样了!’,但是,我们在这里,因为谷歌还没有提供一个更简单的方法 我一直在使用基于队列的解决方案,效果很好: 导入日期时间 从模型导入* DELETABLE_MODELS = [Alpha, Beta, AlphaBeta] def initiate_purge(): for e in config.DELETABLE_MODELS: deferred.defer(delete_entities, e, 'purging', _queue =

我知道你在想什么,‘哦,别再那样了!’,但是,我们在这里,因为谷歌还没有提供一个更简单的方法

我一直在使用基于队列的解决方案,效果很好:

导入日期时间 从模型导入*

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')
我尝试过删除与这些实体类型相关的索引,但没有任何区别


任何建议都将不胜感激。

我不认为尝试删除引用了仍然存在的实体的实体是一个真正的问题,但如果您重新编写任务以串行方式而不是并行方式删除实体,则始终可以排除此问题:

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

我不认为尝试删除引用了仍然存在的实体的实体是一个真正的问题,但如果您重新编写任务以串行方式而不是并行方式删除实体,则始终可以排除这一问题:

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

“删除之前的实体”是打字错误吗?您是否可能试图推迟对不存在的函数的调用?是的,谢谢。这就是当你简化代码时会发生的事情。AlphaBeta真的是指EntityOrigin吗?是的,另一个打字错误。很抱歉我希望现在所有的问题都解决了。是不是“删除实体之前”一个拼写错误?您是否可能试图推迟对不存在的函数的调用?是的,谢谢。这就是当你简化代码时会发生的事情。AlphaBeta真的是指EntityOrigin吗?是的,另一个打字错误。很抱歉我希望现在一切都好了。哦,我明白你对平行事物的意思了。我来试试这个方法。哦,我明白你说的平行的意思了。我将尝试这种方法。