「Google appengine のデータストア モデルの行数を取得するにはどうすればよいですか?」の重複
ユーザー数を知りたい。以前は、次のコードでこれを実現しました。
users = UserStore.all()
user_count = users.count()
しかし、今では 1,000 人を超えるユーザーがいて、このメソッドは引き続き 1,000 を返します。
自分のユーザー数をプログラムで効率的に知る方法はありますか?
「Google appengine のデータストア モデルの行数を取得するにはどうすればよいですか?」の重複
ユーザー数を知りたい。以前は、次のコードでこれを実現しました。
users = UserStore.all()
user_count = users.count()
しかし、今では 1,000 人を超えるユーザーがいて、このメソッドは引き続き 1,000 を返します。
自分のユーザー数をプログラムで効率的に知る方法はありますか?
それは確かに重複しており、他の投稿では理論的にそれを行う方法が説明されていますが、実際にはこの方法でカウントを行うべきではないことを強調したいと思います. その理由は、BigTable はその分散された性質上、集計には非常に適していないためです。おそらくやりたいことは、そのエンティティにトランザクション カウンターを追加することです。トランザクションが多い場合は、シャード カウンターを追加します。参照: http://code.google.com/appengine/articles/sharding_counters.html
更新: 1.3.1 カーソルにより、このような作業がはるかに簡単になります: http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html#Query_Cursors
SDKのバージョン1.3.6以降、カウント関数の1000の制限が削除されました。そのため、count関数を呼び出すと、1000を超える場合でも、正確な数のエンティティが返されるようになりました。エンティティが多すぎて、リクエストがタイムアウトする前にcount関数が返されない場合にのみ制限があります。
ここの例のようにページネーションを使用します。
私はクエリをカウントするためにこのメソッドを作成しましたが、ニック・ジョンソンはどうしてそれは悪い考えだと言ったのでしょうか...
def query_counter (q, cursor=None, limit=500):
if cursor:
q.with_cursor (cursor)
count = q.count (limit=limit)
if count == limit:
return count + query_counter (q, q.cursor (), limit=limit)
return count
Python GAE SDK の場合、count メソッドの引数「limit」を増やすことができます: https://developers.google.com/appengine/docs/python/datastore/queryclass#Query_count