【问题标题】:how to understand "cursor" correctly如何正确理解“光标”
【发布时间】:2011-09-27 07:39:02
【问题描述】:

我正在尝试将光标应用于我的应用程序,但是文档对我来说不够清晰。 谷歌对光标的描述 http://code.google.com/appengine/docs/python/datastore/queries.html#Query_Cursors

光标的位置定义为最后一个返回结果之后的结果列表中的位置。光标不是列表中的相对位置(它不是偏移量);它是开始索引扫描以获取结果时数据存储可以跳转到的标记。如果查询的结果在使用游标之间发生变化,则查询只会注意到游标之后结果中发生的变化。如果查询的游标位置之前出现了新的结果,则在获取游标之后的结果时不会返回该结果。同样,如果实体不再是查询的结果,而是出现在光标之前,则出现在光标之后的结果不会改变。如果最后返回的结果从结果集中移除,游标仍然知道如何定位下一个结果。

在我的理解中,查询结果看起来总是会以默认顺序返回(例如 __ key __)。然后,使用指定游标,它将添加一个过滤器以过滤掉该游标之前的所有结果。正如谷歌过去提到的那样。这是真的吗?

使用 __ 键 __ 和非唯一属性进行分页 http://code.google.com/appengine/articles/paging.html

另一个问题,光标可以与迭代或任务一起使用吗? 由于某些原因,此功能将无法正常工作。 通常在迭代过程中可能会产生“query not found”。

这是我的例子:

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})

【问题讨论】:

    标签: python google-app-engine gql


    【解决方案1】:

    您的理解或多或少是正确的,但不能将光标视为简单地添加过滤器。假设您有一个结果集,首先按年龄排序,然后按名称排序。如果您最后返回的结果是 age=30 且 name=Bob,则没有一组条件可以准确返回之后的结果 - age>=30 并且 name>Bob 不会返回 31 岁的 Alice。

    游标更像是结果集中的书签。它表示您离开的地方,因此您可以稍后再回来。如果结果集在光标之前或之后被修改,光标将保持在同一位置 - 因此您将始终从上次中断的地方继续。

    回答您的其他问题:是的,查询总是有一个隐含的顺序。这取决于所讨论的查询(在您的情况下,它将首先按年龄,然后按 key),但它确保了结果的总顺序。您引用的分页文章已过时,并提供了分页的前导方法。您可以忽略它以支持游标。

    您可以很好地在任务之间(以及与用户之间)传递光标。如果您看到错误,您必须先向我们展示堆栈跟踪,然后我们才能提供任何帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 2012-10-08
      • 2016-07-28
      • 1970-01-01
      • 2013-10-15
      • 2013-01-01
      • 2020-08-12
      相关资源
      最近更新 更多