指定した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 まで対応してるとは書いてない。
試したら期待通りに動いてくれたとはいえ、いずれ無視されるようになるかもしれないなーと思った。