2011-07-02 30 views
3

我試圖將光標應用於我的應用,但是,文檔對我來說不夠清晰。 谷歌的光標 http://code.google.com/appengine/docs/python/datastore/queries.html#Query_Cursors如何正確理解「光標」

說明最後的結果返回後,光標的位置被定義爲在結果列表中的位置。遊標不是列表中的相對位置(它不是偏移量);這是數據存儲啓動索引掃描結果時可以跳到的標記。如果查詢的結果在遊標使用之間發生變化,則查詢只會注意遊標之後結果中發生的變化。如果在查詢的光標位置之前出現新結果,則在獲取光標後的結果時不會返回該結果。同樣,如果實體不再是查詢的結果,而是出現在光標之前,則光標後面出現的結果不會更改。如果返回的最後結果從結果集中移除,則光標仍然知道如何找到下一個結果。

在我的理解中,它看起來像查詢結果將始終以默認順序返回(如__鍵__)。然後,使用指定的遊標,它將添加一個過濾器來過濾掉該遊標之前的所有結果。就像谷歌過去提到的一樣。真的嗎?

尋呼與__ __鍵和非唯一屬性 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且姓名> Bob不會返回Alice,她是31歲。

A光標更像是您的結果集中的書籤。它表示你離開的地方,所以你可以稍後再回來。如果結果集在遊標之前或之後被修改,則遊標保持在同一個位置 - 所以你總是會在你離開的地方拾取。

要回答您的其他問題:是的,查詢總是有默認的順序。這取決於有問題的查詢(在您的情況下,它將按年齡先排序,然後按),但它確保總的排序結果。您提到的分頁文章已過時,併爲分頁提供了前導方法。您可以忽略它,以支持遊標。

你可以在任務(和用戶之間)傳遞遊標。如果你看到一個錯誤,你必須向我們展示堆棧跟蹤,然後纔能有任何幫助。