2013-02-13 60 views
4

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

也许有某种范围的功能。

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

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查询又名ID

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

ID是在模型中显式定义的Book实体的一个属性还是它在ndb中的ID,它等于旧数据库中的key_name? – Tkingovr 2013-02-13 09:27:58

+1

而不是db.delete你应该使用key.delete() – Tkingovr 2013-02-13 09:33:59

+1

你听起来很沮丧。挂在那里。如果您发现答案,请记得回传。 +1 – kasavbere 2013-02-13 18:38:53

回答

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)]) 
+0

这是行不通的。我需要一个属性all。 – learner 2013-02-13 09:07:43

+1

我改变了答案我忽略了你想通过ID检索 – Tkingovr 2013-02-13 09:11:48

+0

它抱怨'Book'没有属性'all'。 – learner 2013-02-13 09:15:46

10

您应该使用ndb.delete_multi()

from google.appengine.ext import ndb 

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

你应该去通过NDB Queries,看看你有什么其他的选择,什么事都能实现。

+0

+1这工作。但到目前为止,它删除了一切。你知道我怎么能指定范围?我尝试'Book.query(Book.id <19001)'但那不行。 – learner 2013-02-13 17:31:16

+0

此外,如果我通过语言删除,它的作品:'Book.query(Book.language ==“english”)''。这将删除语言为“english”的所有实体。查询“自动生成”字段有问题吗?我的数据库有一个字段,我指定了,但是它是自动生成的,称为'id'。另外,虽然我在我的Python脚本中有'id',它在数据查看器中显示为'ID'。该属性是'id = ndb。IntegerProperty()' – learner 2013-02-13 17:43:02

+0

@ user1612593你不能通过实际上是'key.id()'的自动生成的id值来查询,但你可以通过id查询。我会避免将我的字段命名为id,因为它可能与其他id混淆。我通过链接更新了我的答案,您必须了解更多信息 – Lipis 2013-02-13 19:02:16

1

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

然后,迭代和删除。

+0

+1帮助。我需要的是在发布我的编辑时能够通过键进行查询。 – learner 2013-02-13 18:36:33

相关问题