从应用引擎中删除实体

时间:2011-02-09 03:52:12

标签: google-app-engine entity google-cloud-datastore

我要删除我的python app引擎服务器中的条目:

    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

..但它似乎很难看,我一直怀疑它并不完全可靠。有没有办法更好地删除某些类型的条目而不是在循环中创建其中一个类型?

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

3 个答案:

答案 0 :(得分:4)

您可以使用管理控制台的数据存储区管理标签删除所有类型的实体,有关详细信息,请参阅此处:

http://code.google.com/appengine/docs/adminconsole/datastoreadmin.html#Deleting_Entities_in_Bulk

答案 1 :(得分:3)

一些改进:

  1. 每批后你不需要睡觉
  2. 您应该使用任务队列,如果在截止日期之前没有完成,请准备好连接其他任务。
  3. 你应该使用游标。如果不这样做,后续查询必须跳过您已删除的所有“逻辑删除”行,以便访问仍然存在的行。
  4. 如果您要删除大部分或全部类型,则可能需要使用mapreduce库。

答案 2 :(得分:0)

如果要删除大量数据,可能需要使用Google提供的deferred库 - 让cron作业启动延迟任务,可以批量删除对象:

class DeleteMapper(mapper.Mapper):
    KIND = MyKindOfObject

    # Delete all objects of type MyKindOfObject.
    def map(self, key):
        todelete = [key]
        return ([], todelete)

您可能会对较新的mapreduce库执行类似操作,但是,我没有您的示例。