注意: ここでは (ndb ではなく) db を使用しています。ndb に count_async() があることは知っていますが、ndb への移行を伴わない解決策を望んでいます。
クエリに一致するエンティティの数を正確にカウントする必要がある場合があります。db を使用すると、これは単純に次のようになります。
q = some Query with filters
num_entities = q.count(limit=None)
エンティティごとに小さなデータベース操作が必要ですが、必要な情報が得られます。問題は、同じリクエストでこれらのいくつかを実行する必要があることがよくあることです。それらを非同期で実行できればよいのですが、db ライブラリではそれがサポートされていません。
run(keys_only=True, batch_size=1000) はクエリを非同期で実行し、イテレータを返すため、使用できると考えていました。最初に各クエリで run() を呼び出し、後で各反復子からの結果をカウントできます。count() と同じコストがかかりますが、run() はテストで遅くなることが証明されています (おそらく実際に結果を返すため)。 count() メソッドよりも数千のエンティティをカウントします。
run() のテスト コードは次のようになります。
queries = list of Queries with filters
iters = []
for q in queries:
iters.append( q.run(keys_only=True, batch_size=1000) )
for iter in iters:
count_entities_from(iter)