SQLAlchemy ORDINA PER DESCENDERE?


424

Come posso usare ORDER BY descendingin una query SQLAlchemy come la seguente?

Questa query funziona, ma li restituisce in ordine crescente:

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 :)
        )

Se provo:

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

allora ottengo: NameError: global name 'desc' is not defined.

Risposte:


694

Proprio come una FYI, puoi anche specificare quelle cose come attributi di colonna. Ad esempio, avrei potuto fare:

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

Questo è utile poiché evita un import, e puoi usarlo in altri luoghi come in una definizione di relazione, ecc.

Per ulteriori informazioni, puoi fare riferimento a questo


28
evita anche un import.
Capi Etheriel,

1
C'è un riferimento API per questo, sarebbe bello sapere cos'altro è disponibile?
John Mike,

Grazie per questo. Sembra che manchi dalla documentazione ufficiale.
user3341078

1
La migliore risposta (al momento).
RodriKing,


339
from sqlalchemy import desc
someselect.order_by(desc(table1.mycol))

Utilizzo da @ jpmc26


15
Uso: someselect.order_by(desc(table1.mycol))(Tratto dai documenti .) ... perché io per primo non l'ho notato nella tua domanda.
jpmc26,

1
I documenti hanno un nuovo URL
hughes,

73

Un'altra cosa che potresti fare è:

.order_by("name desc")

Ciò comporterà: ORDINA PER nome descr. Lo svantaggio qui è il nome di colonna esplicito utilizzato in ordine da.


25
Questa è una soluzione potenzialmente fragile in cui non è necessaria una soluzione alternativa.
BlueBomber,

13
Questo è utile se hai la colonna di ordinamento in una stringa per qualsiasi motivo (come l'input disinfettato in un'API Web).
Jim Stewart,

19
Come follow-up, puoi anche farlo getattr(MyModelClass, column_string).desc()se hai una stringa.
Jim Stewart,

9
@JimStewart e per passare in direzione ho finito per usare:qry.order_by(getattr(getattr(Song, sort_by), sort_dir)())
Tjorriemorrie

1
È inoltre possibile utilizzare questo se si hanno etichettato la vostra uscita e sono l'ordinamento per una colonna calcolata invece di una colonna del modello
boatcoder

28

È possibile utilizzare la .desc()funzione nella query in questo modo

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

Questo ordinerà per importo in ordine decrescente o

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

Uso della funzione desc di 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)
)
)

Per documenti ufficiali, utilizza il link o controlla lo snippet di seguito

sqlalchemy.sql.expression.desc (colonna) Produce un elemento della clausola ORDER BY decrescente.

per esempio:

from sqlalchemy import desc

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

produrrà SQL come:

SELECT id, name FROM user ORDER BY name DESC

La funzione desc () è una versione autonoma del metodo ColumnElement.desc () disponibile su tutte le espressioni SQL, ad esempio:

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

Colonna Parametri - A ColumnElement (ad es. Espressione SQL scalare) con cui applicare l'operazione desc ().

Guarda anche

asc ()

nullsfirst ()

nullslast ()

Select.order_by ()


5
come è questo non è un duplicato di stackoverflow.com/a/4187279/2718295
cowbert

12

Puoi provare: .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

Complementare alla risposta @Radu, Come in SQL, è possibile aggiungere il nome della tabella nel parametro se si dispone di molte tabelle con lo stesso attributo.

.order_by("TableName.name desc")

Questo non richiede il wrapping della stringa con text ()?
Glutexo,

Fai attenzione, causa un errore in SQLAlchemy> 1.3, un avviso nelle versioni inferiori
Checo R
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.