GAEに於いてcount()で1,000件以上を取得する

自らの運営する HamaZoランクチェック!Google App Engine (以下GAE)上に構築していて、 はまぞう(HamaZo)ブログシステムに於いて 一度でも200位以内に入ったブログをDBに登録しています。 機能の一つとして パーソナル検索 を用意していて当該ページを開くと 現在DBに登録されているブログ数を表示しています。

この数値を取得を count() で得ていた訳ですが、GAEの仕様で1,000以上の数値は返されませんでした。 DBに1,000件以上レコードが登録されていても all().count() で返ってくる数値は1,000だったのです。

遂に先月は2011年5月に HamaZoランクチェック! に於ける登録ブログ数も1,000ブログを越えましたので、 この問題に対処する必要が生じました。 これを解決するのに参考にしたサイトが…

スポンサーリンク

ブログ 山本隆の開発日誌 の2010年8月23日の記事 Google App Engine Version 1.3.6の新機能 です。 此処には様々な GAE のアップデート内容が解説されていますが、 その中の最初の解説部分が本記事で望んでいる内容に該当し、 それを以下に引用させていただきます。

QueryとGqlQueryの基底クラス(_BaseQuery)で、取得できる件数の初期値が1000件に設定されています。
class _BaseQuery(object):
  def count(self, limit=1000, **kwargs):
このため引数で制限を指定しない場合は、取得できる件数は従来と同じで1000件までです。
count = models.Comment.all().count()
  #=>最大1000
1000件以上取得したい場合は、引数で指定します。
count = models.Comment.all().count(99999)
  #=>最大99999
GAE がバージョン1.3.6で 何とも引数を与えるだけ、と云う実に簡単な処理で、 当方の予てよりの懸念を解決出来る様にアップデートしてくれているとの情報で、 早速一昨日試してみました。

memcache を利用してDBへの問合せを減らしている為、 結果の出たのは翌日の昨日でしたが、 全く想定通り、見事1,000以上の数字を返してくれていました。 本日2011年6月7日に パーソナル検索 を開いてみれば

現在 1011 ブログが登録されています
と表示され、DBから1,000以上の数値を受け取っていることを見て取れます。

実はこの処理の為の情報を探すに於いて、 DBモデル作成時に任意でカウント専用のシリアル値をインクリメントで用意しておく、 と云う少々スマートとは言い難い様に感じるものから、 SELECT __key__ FROM を使用してインスタンスとしてではなくDBからレコードを取り出して勘定する、 と云う、これは今後ちょっと使ってみたいぞ! と食指の動くもの迄、様々な情報が見付かりましたが、 この正しく欲しかったと云う願望通りの有り難い情報にはなかなか行き当たりませんでした。 これはちょうど1,000件の辺りで登録情報が烏鷺烏鷺している様な、 DBの利用度としては少な目の利用法をしていて、 なおそのインスタンスではなく件数だけ取り出したいと云う様な方が、 GAE界隈ではマイナーな存在なんだろうとも思います。 正直この情報を見た時には一瞥して真の情報とも思えなかったくらいです。 実際試してみてその結果に今は実にこの情報に感謝している様な状況です。

3件のコメント

  1. 登録ブログ数の1,000件以上表示

    HamaZoランクチェック!サービスに於けるパーソナル検索ではアクセスした時点での登録ブログ数(2010年9月12日記事ランキングデータベースに登録されるってどう言うこと?参照)の表示をしています。従来サービスを置いているサーバーの仕様上、1,000件以上のブログが登録さ

  2. 凄いレベルですね
    すこぢでも学習させてもらいます。
    有り難うございます。
     

コメントは受け付けていません。