Anwenden von LIMIT und OFFSET auf alle Abfragen in SQLAlchemy

Ich bin der Gestaltung einer API mit SQLAlchemy (Abfragen von MySQL), und ich möchte es zu zwingen, alle meine Fragen zu haben page_size (LIMIT) und page_number (OFFSET) Parameter.

Ist es eine saubere Art und Weise, dies zu tun mit SQLAlchemy? Vielleicht Bau einer Fabrik von einer Art, um eine benutzerdefinierte Abfrage erstellen-Objekt? Oder vielleicht gibt es ein guter Weg, dies zu tun mit einer mixin-Klasse?

Versuchte ich das naheliegende getan und es hat nicht funktioniert, weil .limit() und .offset() muss aufgerufen werden, nachdem alle filter-Bedingungen wurden angewendet:

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

Wenn ich versuche über diese, bekomme ich die exception:

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.
Kommentar zu dem Problem - Öffnen
Bitte nicht Bearbeiten, eine Lösung zu deiner Frage. Stattdessen posten Sie es als eine getrennte Antwort unten. Kommentarautor: Matt

InformationsquelleAutor der Frage Rob Crowell | 2012-11-06

Schreibe einen Kommentar