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.

AP257
quelle

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

Rick
quelle
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
338
from sqlalchemy import desc
someselect.order_by(desc(table1.mycol))

Verwendung von @ jpmc26

AP257
quelle
15
Verwendung: someselect.order_by(desc(table1.mycol))(Aus den Dokumenten entnommen .) ... weil ich es in Ihrer Frage nicht bemerkt habe.
jpmc26
1
Docs haben eine neue URL
Hughes
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.

Radu
quelle
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 ()

anand tripathi
quelle
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()
Artem Baranov
quelle
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")
Michael
quelle
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