SQLAlchemy BESTELLEN NACH ABSTIEG?


424

Wie kann ich ORDER BY descendingin einer SQLAlchemy-Abfrage wie der folgenden verwenden?

Diese Abfrage funktioniert, gibt sie jedoch in aufsteigender Reihenfolge zurück:

query = (model.Session.query(model.Entry)
        .join(model.ClassificationItem)
        .join(model.EnumerationValue)
        .filter_by(id=c.row.id)
        .order_by(model.Entry.amount) # This row :)
        )

Wenn ich es versuche:

.order_by(desc(model.Entry.amount))

dann bekomme ich : NameError: global name 'desc' is not defined.

Antworten:


692

Genau wie zu Ihrer Information können Sie diese Dinge auch als Spaltenattribute angeben. Zum Beispiel hätte ich tun können:

.order_by(model.Entry.amount.desc())

Dies ist praktisch, da es eine vermeidet import und Sie es an anderen Stellen verwenden können, z. B. in einer Beziehungsdefinition usw.

Weitere Informationen finden Sie hier


28
es vermeidet auch eine import.
Capi Etheriel

1
Gibt es eine API-Referenz dafür, wäre es cool zu wissen, was noch verfügbar ist?
John Mike

Danke dafür. Es scheint, dass es in der offiziellen Dokumentation fehlt.
user3341078

1
Die beste Antwort (im Moment).
RodriKing



73

Eine andere Sache, die Sie tun könnten, ist:

.order_by("name desc")

Dies führt zu: ORDER BY name desc. Der Nachteil hierbei ist der explizite Spaltenname, der in der Reihenfolge von verwendet wird.


25
Dies ist eine möglicherweise spröde Problemumgehung, bei der keine Problemumgehung erforderlich ist.
BlueBomber

13
Dies ist jedoch hilfreich, wenn Sie die Sortierspalte aus irgendeinem Grund in einer Zeichenfolge haben (wie bei bereinigten Eingaben in einer Web-API).
Jim Stewart

19
Als Folge können Sie auch tun, getattr(MyModelClass, column_string).desc()wenn Sie eine Zeichenfolge haben.
Jim Stewart

9
@ JimStewart und für die Übergabe in Richtung habe ich am Ende verwendet:qry.order_by(getattr(getattr(Song, sort_by), sort_dir)())
Tjorriemorrie

1
Sie können dies auch verwenden, wenn Sie Ihre Ausgabe beschriftet haben und nach einer berechneten Spalte anstelle einer Modellspalte
sortieren

28

Sie können die .desc()Funktion in Ihrer Abfrage einfach so verwenden

query = (model.Session.query(model.Entry)
        .join(model.ClassificationItem)
        .join(model.EnumerationValue)
        .filter_by(id=c.row.id)
        .order_by(model.Entry.amount.desc())
        )

Dies erfolgt nach Betrag in absteigender Reihenfolge oder

query = session.query(
    model.Entry
).join(
    model.ClassificationItem
).join(
    model.EnumerationValue
).filter_by(
    id=c.row.id
).order_by(
    model.Entry.amount.desc()
)
)

Verwendung der Desc-Funktion von SQLAlchemy

from sqlalchemy import desc
query = session.query(
    model.Entry
).join(
    model.ClassificationItem
).join(
    model.EnumerationValue
).filter_by(
    id=c.row.id
).order_by(
    desc(model.Entry.amount)
)
)

Für offizielle Dokumente verwenden Sie bitte den Link oder überprüfen Sie das folgende Snippet

sqlalchemy.sql.expression.desc (Spalte) Erzeugt ein absteigendes ORDER BY-Klauselelement.

z.B:

from sqlalchemy import desc

stmt = select([users_table]).order_by(desc(users_table.c.name))

erzeugt SQL als:

SELECT id, name FROM user ORDER BY name DESC

Die Funktion desc () ist eine eigenständige Version der ColumnElement.desc () -Methode, die für alle SQL-Ausdrücke verfügbar ist, z.

stmt = select([users_table]).order_by(users_table.c.name.desc())

Parameters column - Ein ColumnElement (z. B. skalarer SQL-Ausdruck), mit dem die desc () -Operation angewendet werden soll.

Siehe auch

asc ()

nullsfirst ()

nullslast ()

Select.order_by ()


5
Wie ist das nicht ein Duplikat von stackoverflow.com/a/4187279/2718295
Cowbert

12

Du kannst es versuchen: .order_by(ClientTotal.id.desc())

session = Session()
auth_client_name = 'client3' 
result_by_auth_client = session.query(ClientTotal).filter(ClientTotal.client ==
auth_client_name).order_by(ClientTotal.id.desc()).all()

for rbac in result_by_auth_client:
    print(rbac.id) 
session.close()

0

Komplementär bei @ Radu Antwort: Wie in SQL können Sie den Tabellennamen in den Parameter einfügen, wenn Sie viele Tabellen mit demselben Attribut haben.

.order_by("TableName.name desc")

Erfordert dies nicht das Umschließen der Zeichenfolge mit text ()?
Glutexo

Achten Sie darauf, dass es einen Fehler in SQLAlchemy> 1.3 verursacht, eine Warnung in niedrigeren Versionen
Checo R
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.