2011-07-02 4 views
3

私は自分のアプリにカーソルを適用しようとしていますが、文書が私にとって十分にはっきりしていません。最後の結果が返された後、カーソル http://code.google.com/appengine/docs/python/datastore/queries.html#Query_Cursors"カーソル"を正しく理解する方法

ため Googleの説明は、カーソルの位置は、結果リスト内の位置として定義されます。カーソルはリスト内の相対位置ではありません(オフセットではありません)。結果のインデックススキャンを開始するときにデータストアがジャンプできるマーカーです。クエリの結果がカーソルの使用の間で変更された場合、クエリはカーソルの後の結果で発生する変更のみに注目します。クエリのカーソル位置の前に新しい結果が表示された場合は、カーソルの後に結果が取得されたときに新しい結果が返されません。同様に、エンティティがクエリの結果ではなくカーソルの前に現れた場合、カーソルの後に表示される結果は変更されません。返された最後の結果が結果セットから削除された場合、カーソルは引き続き次の結果の検索方法を認識します。

私の理解では、クエリ結果は常にデフォルトの順序(__ 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歳のAliceを返さない基準はありません。

Aカーソルは結果セットのブックマークのようなものです。あなたが中断した場所を示していますので、後で戻ってくることができます。結果セットがカーソルの前または後に変更された場合、カーソルは同じ場所にとどまるため、中断した箇所を常にピックアップします。

他の質問に答えるには:はい、クエリは常に暗黙の順序を持​​っています。それは問題のクエリに依存します(あなたのケースでは、年齢別にキー)。しかし、それは結果に合計順序があることを保証します。あなたが参照するページング記事は古くなっており、ページ区切りへのプリカーソルアプローチを提供しています。あなたはそれをカーソルのために無視することができます。

タスク間(およびユーザー間)にカーソルを渡すことができます。エラーが表示される場合は、スタックトレースを表示してからサポートを受ける必要があります。

関連する問題