如何轻松删除谷歌应用引擎中的整个db.model类?

时间:2010-07-15 19:32:56

标签: google-app-engine

您好我读了一些关于这个主题的帖子,假设我想删除给定类db.model的每个对象,比如LinkRating2,有没有办法在启动时用简单的命令删除它?我以为我记得在某个地方看到这个 - 清楚数据存储区?,否则我一直在sdk控制台中尝试各种方法,但所有似乎都是内存崩溃因为文件永远只是为了加载和启动我不认为有任何关于lol的记忆。那么删除整个实体的最佳代码方法是什么?

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)

4 个答案:

答案 0 :(得分:2)

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

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

我没有把它放在while循环中,因为试图一次性删除所有实体可能很有可能超过30秒的截止日期。你只需要这样做,直到所有的实体都消失了。

答案 1 :(得分:2)

  

有没有办法在启动时删除它   用一个简单的命令?我想我   记得在某个地方看到这个例如    - clear datastore?

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

  

我暂时不打扰它   循环,因为试图删除所有的   一次性实体可能代表一个   很有可能超过30秒   最后期限。你只需要这样做   直到所有实体都消失了。

如果您确实要在生产中消灭给定类型的每个实体,这是使用remote_api而不是编写基于Web的处理程序的好借口,以规避30秒的截止日期并减少您的实体启动代码偶然再次运行的可能性。

最后一件事:如果您想删除某些实体但又不想加载模型定义,则可以使用低级数据存储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 :(得分:0)

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)

答案 3 :(得分:0)

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

此问题已被提出:Delete all data for a kind in Google App Engine

我认为这个答案会为你提供你想要的东西。它按键删除项目,这应该快得多: Delete all data for a kind in Google App Engine