50

SQLAlchemy (MySQL のクエリ) を使用して API を設計しており、すべてのクエリに page_size (LIMIT) および page_number (OFFSET) パラメータを強制したいと考えています。

SQLAlchemy でこれを行うクリーンな方法はありますか? おそらく、カスタム Query オブジェクトを作成するために何らかのファクトリを構築するのでしょうか? それとも、ミックスインクラスでこれを行う良い方法がありますか?

すべてのフィルター条件が適用された後に .limit() および .offset() を呼び出す必要があるため、明らかなことを試しましたが、機能しませんでした。

def q(page=0, page_size=None):
    q = session.query(...)
    if page_size: q = q.limit(page_size)
    if page: q = q.offset(page*page_size)
    return q

これを使用しようとすると、例外が発生します。

sqlalchemy.exc.InvalidRequestError: Query.filter() being called on a Query which already has LIMIT or OFFSET applied. To modify the row-limited results of a  Query, call from_self() first.  Otherwise, call filter() before limit() or offset() are applied.
4

3 に答える 3

51

最初の必須の引数を追加してみてください。これは、クエリ フィルターのグループである必要があります。したがって、

# q({'id': 5}, 2, 50)
def q(filters, page=0, page_size=None):
    query = session.query(...).filter_by(**filters)
    if page_size:
        query = query.limit(page_size)
    if page: 
        query = query.offset(page*page_size)
    return query

また、

# q(Model.id == 5, 2, 50)
def q(filter, page=0, page_size=None):
    query = session.query(...).filter(filter)
    if page_size:
        query = query.limit(page_size)
    if page: 
        query = query.offset(page*page_size)
    return query
于 2012-11-06T20:37:06.460 に答える