如何通过键从 GAE 数据存储中删除多个实体

Posted

技术标签:

【中文标题】如何通过键从 GAE 数据存储中删除多个实体【英文标题】:How to delete multiple entities from GAE datastore by keys 【发布时间】:2013-02-13 07:53:30 【问题描述】:

我在本地主机上使用 Google App Engine。我在数据存储区中有 2000 个 Book 实体。我想删除第一个 1900(键范围从 1 到 1901)。我将如何从交互式控制台执行此操作?我使用ndb 而不是db

也许有某种范围功能。

例如,我尝试以下操作,但没有任何反应。

from myddb import Book

list= Book.gql("WHERE ID < 193")

for entity in list:
  db.delete(entity) 

编辑:

根据@Lipis 的回复,以下是有效的

from myddb import Book

from google.appengine.ext import ndb

book_keys = Book.query().fetch(keys_only=True)
ndb.delete_multi(book_keys)

但这会删除所有内容。我需要做的是查询Key aka ID like

book_keys = Book.query(Article._Key < 1901).fetch(keys_only=True)

【问题讨论】:

ID 是模型中明确定义的 Book 实体的属性,还是 ndb 中的 id,相当于旧 db 中的 key_name? 你应该使用 key.delete() 而不是 db.delete 你听起来很沮丧。挂在那里。如果你找到答案记得回帖。 +1 【参考方案1】:

你应该使用ndb.delete_multi():

from google.appengine.ext import ndb

book_keys = Book.query().fetch(keys_only=True)
ndb.delete_multi(book_keys)

您应该通过NDB Queries 了解您还有哪些其他选择以及您可以实现的目标。

【讨论】:

+1 这行得通。但到目前为止,它删除了所有内容。你知道我怎么能指定范围吗?我尝试Book.query(Book.id &lt; 19001) 但这不起作用。 另外,如果我按语言删除,它可以工作:Book.query(Book.language == "english")。这将删除语言为english 的所有实体。查询auto-generated 字段有问题吗?我的数据库有一个字段,我指定但它是自动生成的,称为id。此外,虽然我的 python 脚本中有id,但它在数据查看器中显示为ID。该属性是id = ndb.IntegerProperty() @user1612593 您无法通过自动生成的 id 值进行查询,该值实际上是 key.id().. 但您可以通过 id 进行查询。我会避免将 id 命名为我的字段,因为它可能会与另一个 id 混淆。我更新了我的答案,提供了一个链接,您必须通过这些链接才能了解更多信息 感谢您的帮助。你看过我最新的编辑吗?我想我需要按键查询,在dataviewer 上显示为ID。你知道如何按我上面显示的键查询吗?我一直在尝试各种filters。到目前为止什么都没有。 如何根据实体键获取实体,例如Ingredient.gql('WHERE Key = :1', self.key).fetch(),但对我来说它显示成分模型没有属性键。【参考方案2】:

编辑

我没有测试下面的解决方案,但测试它并告诉我。

这也应该有很大帮助ndb cheat sheet

q = Book.query(default_options=QueryOptions(keys_only=True))

   if Book.ID < 1901:
      ndb.delete_multi([m.key for m in q.fetch(1900)])

【讨论】:

我更改了我忽略的答案,您希望通过 ID 检索 它抱怨Book没有属性all 我使用的是 ndb 而不是 db。我不知道这是否重要。 是的,您应该将其包含在问题中。 我将编辑帖子。我设法使用Book.query() 获得了一个结果集,但删除部分仍然不起作用。【参考方案3】:

ndb you use q = Book.query('query').fetch('number')

然后,迭代和删除。

【讨论】:

+1 表示帮助。我需要的是能够在我发布我的编辑时按键查询。

以上是关于如何通过键从 GAE 数据存储中删除多个实体的主要内容,如果未能解决你的问题,请参考以下文章

如何确保 GAE 上的 MemCache 和 Datastore 之间的一致性?

在 GAE 中使用任务队列插入批量数据

请帮助我了解 GAE 数据存储区中的实体层次结构

是否可以在多个 GAE 应用程序之间共享数据存储

GAE ndb 存储大型一对多关系的最佳实践

Google AppEngine (GAE) - 完整的对象键