指定したdatetime値でのfilter
ユーザー一覧の表示などする時には fetch() を使っていた。
しかしこれでは1000件の壁にぶち当たる。
そこで datetime 値での filter を使用した。
- こんなモデルがあったとする
from google.appengine.ext import db class Member(db.Model): insert_datetime = db.DateTimeProperty(auto_add = True) name = db.StringProperty() age = db.IntegerProperty()
- 検索はこんな感じ
# 検索 パターン1 def search_query_patterm(delimiter_id=None): """ Member から指定した件数の情報を取得する。 insert_datetime を昇順ソートし delimiter_id で指定した Member までを除外する。 """ from google.appengine.ext import db from member.models import Member import datetime if delimiter_id is None: delimiter_dt = str(datetime.datetime.now()) else: m = Member.get(delimiter_id) delimiter_dt = str(m.insert_datetime) m = Member.all()\ .filter('insert_datetime > ', delimiter_dt)\ .order('insert_datetime') .fetch(10, 0) return m # 検索 パターン2 def search_gql_patterm(delimiter_id=None): """ Member から指定した件数の情報を取得する。 insert_datetime を昇順ソートし delimiter_id で指定した Member までを除外する。 """ from google.appengine.ext import db from member.models import Member import datetime if delimiter_id is None: delimiter_dt = str(datetime.datetime.now()) else: m = Member.get(delimiter_id) delimiter_dt = str(m.insert_datetime) gql = "SELECT * FROM member_member" gql += " WHERE insert_datetime > DATETIME('%s')" gql += " ORDER BY insert_datetime ASC" m = db.GqlQuery(gql % datetime_dt) return m
microsecond があれば、そこまで比較してくれる。ドキュメントを見ると一番細かいのは「DATETIME(year, month, day, hour, minute, second)」または「DATETIME('YYYY-MM-DD HH:MM:SS')」と記載されていて microsecond まで対応してるとは書いてない。
試したら期待通りに動いてくれたとはいえ、いずれ無視されるようになるかもしれないなーと思った。