Google app engine 从应用程序引擎中删除实体

Google app engine 从应用程序引擎中删除实体,google-app-engine,entity,google-cloud-datastore,Google App Engine,Entity,Google Cloud Datastore,我将从python应用程序引擎服务器中删除条目,如下所示: try: while True: q = db.GqlQuery("SELECT __key__ FROM SampleData") assert q.count() db.delete(q.fetch(400)) time.sleep(0.2) except Exception, e:

我将从python应用程序引擎服务器中删除条目,如下所示:

    try:
        while True:
            q = db.GqlQuery("SELECT __key__ FROM SampleData")
            assert q.count()
            db.delete(q.fetch(400))
            time.sleep(0.2)
        except Exception, e:
        self.response.out.write(repr(e)+'\n')
        pass

        try:
        while True:
            q = db.GqlQuery("SELECT __key__ FROM UserData")
            assert q.count()
            db.delete(q.fetch(400))
            time.sleep(0.2)
        except Exception, e:
        self.response.out.write(repr(e)+'\n')
        pass
…但它看起来很难看,我一直怀疑它不完全可靠。是否有更好的方法来删除某些类型的条目,而不是创建其中一个while循环


更新:我的一个限制是,我通过cron作业定期运行此操作,因此不希望手动执行此操作(例如,通过管理控制台)。

您可以使用管理控制台的datastore admin选项卡删除所有类型的实体,有关详细信息,请参阅此处:


如果要删除大量数据,可能需要使用谷歌提供的库——让cron作业启动一个延迟任务,该任务可以批量删除对象:

class DeleteMapper(mapper.Mapper):
    KIND = MyKindOfObject

    # Delete all objects of type MyKindOfObject.
    def map(self, key):
        todelete = [key]
        return ([], todelete)
您可能可以对较新的库执行类似操作,但是,我没有为您提供示例。

一些改进:

  • 你不需要在每一批之后睡觉
  • 您应该使用任务队列,并准备好在截止日期到来之前未完成的情况下链接另一个任务
  • 你应该使用游标。如果不这样做,后续查询必须跳过已删除的所有“逻辑删除”行,才能访问仍然存在的行

  • 如果要删除大部分或全部内容,您可能需要使用mapreduce库。

    谢谢,有用的链接。不幸的是,我忘了提到,我正在定期删除这些作为cron作业的一部分,而不是在调试中重置实体时才执行的操作。我将更新问题。抱歉说得含糊不清。