【问题标题】:how to delete an entire db.model class in google app engine easily?如何轻松删除谷歌应用引擎中的整个 db.model 类?
【发布时间】:2010-07-16 05:03:14
【问题描述】:

您好,我阅读了有关此主题的几篇文章,假设我想删除给定类 db.model 的每个对象,例如 LinkRating2,有没有办法在启动时使用简单的命令删除它?我想我记得在某个地方看到过这个,例如 --clear datastore?,否则我一直在 sdk 控制台中尝试各种方法,但所有似乎都是内存崩溃,因为文件需要永远加载和启动我不认为有任何关于大声笑的记忆。那么删除整个实体的最佳代码方法是什么?

class LinkRating2(db.Model):
    user = db.StringProperty()
    link = db.StringProperty()
    rating2 = db.FloatProperty()

试过了,但是太慢了

results2 = LinkRating2.all()
results = results2.fetch(500)

while results:
    db.delete(results)
    results = results2.fetch(500)

【问题讨论】:

    标签: google-app-engine


    【解决方案1】:

    有没有办法在启动时删除它 用一个简单的命令?我以为我 记得在某处看到这个,例如 --clear 数据存储区?

    如果您在谈论开发服务器,是的。 dev_appserver.py --clear_datastore myapp 将为您启动一个新的数据存储。这是您在本地工作时的最佳选择。

    我没有费心把它放一段时间 循环,因为试图删除所有 一次实体可能站着一个 超过 30 秒的好机会 最后期限。你只需要这样做 直到所有实体都消失。

    如果您确实想在生产中清除给定类型的每个实体,这是使用 remote_api 而不是编写基于 Web 的处理程序的好借口,既可以规避 30 秒的最后期限,又可以减少机会您的 entitypocalypse 代码意外再次运行。

    最后一件事:如果您想删除一些实体但又不想费心加载模型定义,您可以使用低级数据存储 API:

    from google.appengine.api import datastore
    
    kind = 'LinkRating2'
    batch_size = 1000
    
    query = datastore.Query(kind=kind, keys_only=True)
    results = query.Get(batch_size)
    while results:
      print "Deleting %d %s entities" % (batch_size, kind)
      datastore.Delete(results)
      results = query.Get(batch_size)
    

    【讨论】:

      【解决方案2】:

      使用键比使用整个实体要好得多。仅查询实体键比获取整个实体要快得多,并且您只需要删除键。

      results = db.Query(LinkRating2, keys_only=True).fetch(1000)
      if len(results) > 0:
          db.delete(results)
      

      我没有费心把它放在一个 while 循环中,因为尝试一次删除所有实体很可能会超过 30 秒的最后期限。您只需要这样做,直到所有实体都消失。

      【讨论】:

      • 我一次尝试了大约 100k 个实体,遇到了太多的删除 api 错误,所以我输入了一个如下循环,删除实体的正常速率是多少,看起来慢得离谱?仍在运行
      【解决方案3】:
      results = db.Query(Final, keys_only=True).fetch(1000)
      while len(results) > 0:
          db.delete(results)
          results = db.Query(Final, keys_only=True).fetch(1000)
      

      【讨论】:

        【解决方案4】:

        --clear-datastore 标志将清除数据库中的所有数据,而不仅仅是您想要的特定类的数据。

        这个问题已经被问过了:Delete all data for a kind in Google App Engine

        我认为这个答案会为您提供您想要的。它通过键删除项目,这应该更快: Delete all data for a kind in Google App Engine

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-24
        • 2014-07-04
        • 1970-01-01
        • 2011-12-16
        • 1970-01-01
        • 2023-03-25
        • 2011-05-06
        相关资源
        最近更新 更多