Google Apps Engineのデータベースとしてよく使われるdatastore。癖があって正直使いづらい。きれいにSQLできたらいいのですが、それでも使われている理由は無料枠があるから。GAEの無料枠だけでフレームワーク構築できてしまえば、プロトタイプシステムまではこれでできるので、便利だと思います。
さてdatastoreですが、件数取得の場合、通常は以下のような構文で求められます。
DataKind.query().count()
ところが、この方法は1万件などの大量データがある場合に応答が遅くなってしまいます。
解決方法として、件数をキャッシュしておくことですが、これが標準提供されています。
KindStatという統計情報を使います。以下はPython2.7のものでPython3の場合はunicode関数が不要です。
class BaseModel(ndb.Model):
@classmethod
def get_count(_class):
from google.appengine.ext.ndb import stats
stat = stats.KindStat.query().fetch()
ret = [k.count for k in stat if k.kind_name == unicode(_class.__name__)]
return ret[0] if ret else 0
統計情報は本番環境では1日数回、自動で更新されているようですが、開発環境では管理画面で更新する必要があります。 Datastore Statsの「Generate stats」を押して更新します。管理画面の機能は一見、役に立つのかわからないものがありますが、このように機能が必要になってから実感するものですね。