如何通过键从 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 < 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 数据存储中删除多个实体的主要内容,如果未能解决你的问题,请参考以下文章