[GAE] datastore で件数取得

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[0if ret else 0

統計情報は本番環境では1日数回、自動で更新されているようですが、開発環境では管理画面で更新する必要があります。 Datastore Statsの「Generate stats」を押して更新します。管理画面の機能は一見、役に立つのかわからないものがありますが、このように機能が必要になってから実感するものですね。