how to understand “cursor” correctly

心不动则不痛 提交于 2019-12-10 18:31:47

问题


I'm trying to apply cursor to my app, however, the document is not clear enough for me. Google's description for cursor http://code.google.com/appengine/docs/python/datastore/queries.html#Query_Cursors

The cursor's position is defined as the location in the result list after the last result returned. A cursor is not a relative position in the list (it's not an offset); it's a marker to which the datastore can jump when starting an index scan for results. If the results for a query change between uses of a cursor, the query notices only changes that occur in results after the cursor. If a new result appears before the cursor's position for the query, it will not be returned when the results after the cursor are fetched. Similarly, if an entity is no longer a result for a query but had appeared before the cursor, the results that appear after the cursor do not change. If the last result returned is removed from the result set, the cursor still knows how to locate the next result.

In my understanding, it looks like the query results will always return with a default order (such as __ key __). Then, with the specify cursor, it will add a filter to filter out all results before this cursor. Just as google has mentioned in the past. Is that true?

Paging with __ key __ and a non-unique property http://code.google.com/appengine/articles/paging.html

Another question, can cursor be used with iteration or task? For some reasons, this function won't work correctly. Usually it may generate "query not found" in the iteration process.

This is my example:

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

回答1:


Your understanding is more or less correct, but a cursor can't be thought of as simply adding filters. Supposing you have a result set ordered first by age, then by name. If your last returned result has age=30 and name=Bob, there's no set of criteria that will return exactly the results after that - age>=30 and name>Bob won't return Alice, who's 31.

A cursor is more like a bookmark into your result set. It denotes the place you left off, so you can come back later. If the result set is modified before or after your cursor, the cursor remains in the same place - so you'll always pick up where you left off.

To answer your other questions: Yes, queries always have an implied order. What that is depends on the query in question (in your case, it will be first by age, then by key), but it ensures there's a total order over the results. The paging article you refer to is out of date, and provides a pre-cursor approach to pagination. You can ignore it in favor of cursors.

You can pass cursors between tasks (and to and from users) just fine. If you're seeing an error, you'll have to show us the stacktrace before we can be of any help.



来源:https://stackoverflow.com/questions/6557791/how-to-understand-cursor-correctly

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!