我正在尝试将光标应用到我的应用程序,但是,该文档对我来说不够清晰。 Google对光标的描述 http://code.google.com/appengine/docs/python/datastore/queries.html#Query_Cursors
光标的位置定义为返回最后一个结果后结果列表中的位置。光标不是列表中的相对位置(它不是偏移量);它是数据存储区在开始索引扫描结果时可以跳转到的标记。如果查询的结果在使用游标之间发生更改,则查询仅注意光标后结果中发生的更改。如果在查询的光标位置之前出现新结果,则在获取光标后的结果时将不会返回该结果。同样,如果实体不再是查询的结果但已出现在光标之前,则光标后面显示的结果不会更改。如果从结果集中删除了返回的最后一个结果,则光标仍然知道如何找到下一个结果。
在我的理解中,看起来查询结果将始终以默认顺序(例如__ key __)返回。然后,使用指定光标,它将添加一个过滤器,以过滤掉此光标之前的所有结果。正如谷歌过去所提到的那样。这是真的吗?
使用__键__进行分页和非唯一属性 http://code.google.com/appengine/articles/paging.html
另一个问题,游标可以与迭代或任务一起使用吗? 由于某些原因,此功能将无法正常工作。 通常它可能会在迭代过程中生成“未找到查询”。
这是我的例子:
people = Person.all().filter("age > ", 30)
if cursor:
people.with_cursor(cursor)
try:
for person in people: # query not found
cursor = people.cursor()
except DeadlineExceededError:
taskqueue.add(url="/people", params= {"cursor", cursor})
答案 0 :(得分:3)
您的理解或多或少是正确的,但不能将光标视为简单地添加过滤器。假设您的结果集首先按年龄排序,然后按名称排序。如果您上次返回的结果的年龄= 30且名称= Bob,则没有一组标准会在此之后准确返回结果 - age> = 30且name> Bob将不会返回Alice,即31岁。
光标更像是结果集中的书签。它表示你离开的地方,所以你可以稍后回来。如果在光标之前或之后修改了结果集,则光标将保持在同一位置 - 因此您将始终从中断的位置开始。
回答您的其他问题:是的,查询总是有隐含的订单。这取决于有问题的查询(在您的情况下,它将首先按年龄,然后按键),但它确保对结果的总排序。您引用的分页文章已过时,并提供了分页前的方法。你可以忽略它而不是游标。
您可以在任务之间(以及与用户之间)传递游标。如果您发现错误,在我们提供任何帮助之前,您必须向我们展示堆栈跟踪。