2011-07-02 8 views
3

커서를 내 앱에 적용하려하지만, 문서가 충분히 명확하지 않습니다. 마지막 결과가 반환 된 후 커서 http://code.google.com/appengine/docs/python/datastore/queries.html#Query_Cursors"커서"를 올바르게 이해하는 방법

에 대한 구글의 설명은 커서의 위치는 결과 목록의 위치로 정의된다. 커서는 목록의 상대 위치가 아닙니다 (오프셋이 아닙니다). 결과에 대한 인덱스 스캔을 시작할 때 데이터 저장소가 점프 할 수있는 마커입니다. 쿼리의 결과가 커서 사용 사이에서 변경된 경우 쿼리는 커서 뒤에 결과에서 발생하는 변경 사항 만 알립니다. 쿼리의 커서 위치 앞에 새 결과가 나타나면 커서를 가져온 후 결과가 반환 될 때 새 결과가 반환되지 않습니다. 마찬가지로 엔티티가 더 이상 쿼리의 결과가 아니지만 커서 앞에 나타난 경우 커서 뒤에 나타나는 결과가 변경되지 않습니다. 반환 된 마지막 결과가 결과 집합에서 제거되면 커서는 다음 결과를 찾는 방법을 여전히 알고 있습니다.

제 생각에 쿼리 결과는 항상 기본 순서 (예 : __ key __)로 반환됩니다. 그런 다음 커서를 지정하면이 커서 앞에 모든 결과를 필터링하는 필터가 추가됩니다. Google이 과거에 언급 한 것처럼. 그게 사실이야? 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}) 

답변

3

이해가 어느 정도 정확하지만 커서가 단순히 추가 필터로 생각 될 수 없다. 나이별로, 그리고 이름별로 정렬 된 결과 집합이 있다고 가정합니다. 마지막으로 반환 된 결과의 나이가 30이고 이름이 Bob 인 경우 해당 결과가 30 세 이상이고 name> Bob이 31의 앨리스를 반환하지 않는 기준은 없습니다.

A 커서는 결과 세트의 책갈피와 비슷합니다. 그것은 중단 한 장소를 나타내므로 나중에 다시 올 수 있습니다. 결과 집합이 커서 앞뒤에 수정되면 커서는 같은 위치에 남아 있으므로 중단 한 부분부터 항상 선택합니다.

다른 질문에 대답하려면 : 예, 쿼리에는 항상 암시 적 순서가 있습니다. 이 질문은 질문에 따라 달라집니다 (귀하의 경우는 1 년 후 ). 결과에 대해 전체 주문이 이루어 지도록하십시오. 참조하는 페이징 기사가 최신이 아니며 페이지 매김에 대한 사전 커서 접근 방식을 제공합니다. 커서를 사용하여 무시할 수 있습니다.

커서를 작업간에 (그리고 사용자간에) 잘 전달할 수 있습니다. 오류가 발생하면 스택 렛을 보여줘야 도움이 될 것입니다.

관련 문제