バックエンドを使用して、を使用して複数のエンティティを記述してい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
同期的に完了しないかどうかという事実と関係があります。混乱している....