5

バックエンドを使用して、を使用して複数のエンティティを記述していndb.put_multi(list_of_entities)ます。

私が経験している問題は、その直後にクエリを実行しても結果が得られないことです。スリープタイマーをたとえば1秒間置くと、今書いたエンティティを読み取ることができます。

だから例えば:

class Picture(ndb.Expando):
    pass

class Favourite(ndb.Expando):
    user_id = ndb.StringProperty(required=True)
    pass

#...make lists with Picture and Favourite kinds
entities = favourites
entities[1:1] = pictures
ndb.put_multi(entities)

favourites = Favourite.query().filter(Favourite.user_id == user_id).fetch(99999, keys_only=True)
logging.info(len(favourites)) #returns 0 in dev_appserver why?

最初に、問題がキャッシングに関係していると想定しました。しかし

複数のキーまたはエンティティでのNDBエンティティ操作の読み取り:

高度な注意:これらのメソッドは、コンテキストおよびキャッシングと正しく相互作用します。特定のRPC呼び出しに直接対応していません。

NDBキャッシングを読む

インコンテキストキャッシュ

インコンテキストキャッシュは、単一の着信HTTPリクエストの期間のみ存続し、そのリクエストを処理するコードにのみ「表示」されます。これは速い; このキャッシュはメモリ内にあります。NDB関数がデータストアに書き込むとき、コンテキスト内のキャッシュにも書き込みます。NDB関数がエンティティを読み取るとき、最初にコンテキスト内キャッシュをチェックします。エンティティがそこで見つかった場合、データストアの相互作用は発生しません。

クエリはキャッシュ内の値を検索しません。ただし、キャッシュポリシーで指定されている場合、クエリ結果はコンテキスト内キャッシュに書き戻されます(ただし、Memcacheには書き戻されません)。

うーん、ここで迷子になりました。すべてが大丈夫のようです。コンソールからクエリを実行しても正しい合計が得られますが、関数などに関係なく、同じハンドラーでは取得できません。

私が気付いたのは、待つtime.sleep(1)と正しい結果が得られるということだけです。つまり、がndb.put_multi同期的に完了しないかどうかという事実と関係があります。混乱している....

4

1 に答える 1

5

朝の澄んだ心は、夜のめまいの心よりも常に優れています。

コメントありがとうございます。問題が解決しました。あなたは私の質問に答えるために正しい方法で私を導きます:

結果を正しく取得するために、祖先クエリを使用しました。次のことに言及する価値があります

NDB書き込みについて:コミット、キャッシュの無効化、および適用

データを書き込むNDB関数(たとえば、put())は、キャッシュの無効化後に戻ります。適用フェーズは非同期で行われます。

つまり、各プットの後、適用フェーズが完了していない可能性があります。

と:

この動作は、データがアプリケーションに表示される方法とタイミングに影響します。NDB関数が戻ってから数百ミリ秒ほどで、変更が基盤となるデータストアに完全に適用されない場合があります。変更が適用されている間に実行された祖先以外のクエリでは、一貫性のない状態(つまり、変更のすべてではなく一部)が表示される場合があります。書き込みとクエリのタイミングの詳細については、「AppEngineでのトランザクション分離」を参照してください。

また、GoogleAcademyから取得した読み取りと書き込みの一貫性に関するいくつかの事項データストアからのデータの取得

Google App Engineの高レプリケーションデータストア(HRD)は、複数のデータセンターにデータを同期的に保存することで、読み取りと書き込みの高可用性を提供します。ただし、書き込みがコミットされてからすべてのデータセンターに表示されるまでの遅延は、複数のエンティティグループにまたがるクエリ(祖先以外のクエリ)が結果整合性のある結果しか保証できないことを意味します。その結果、そのようなクエリの結果は、基になるデータへの最近の変更を反映できない場合があります。ただし、キーによるエンティティの直接フェッチは常に一貫しています。

常に助けてくれた@PaulCと、理解を助けてくれた@dragonxと@sologoubに感謝します。

于 2013-01-08T13:02:56.060 に答える