ORDRE SQLAlchemy EN DESCENDANT?


424

Comment puis-je utiliser ORDER BY descendingdans une requête SQLAlchemy comme la suivante?

Cette requête fonctionne, mais les renvoie dans l'ordre croissant:

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

Si j'essaye:

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

je reçois: NameError: global name 'desc' is not defined.

Réponses:


694

Tout comme un FYI, vous pouvez également spécifier ces éléments en tant qu'attributs de colonne. Par exemple, j'aurais pu faire:

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

Ceci est pratique car il évite un import, et vous pouvez l'utiliser à d'autres endroits comme dans une définition de relation, etc.

Pour plus d'informations, vous pouvez consulter ce


28
cela évite également un import.
Capi Etheriel

1
Existe-t-il une référence API pour cela, serait-il cool de savoir quoi d'autre est disponible?
John Mike

Merci pour cela. Il semble qu'il manque dans la documentation officielle.
user3341078

1
La meilleure réponse (pour le moment).
RodriKing



73

Une autre chose que vous pourriez faire est:

.order_by("name desc")

Cela se traduira par: ORDER BY nom desc. L'inconvénient ici est le nom de colonne explicite utilisé dans l'ordre par.


25
Il s'agit d'une solution de contournement potentiellement fragile où une solution de contournement n'est pas nécessaire.
BlueBomber

13
C'est bien si vous avez la colonne de tri dans une chaîne pour une raison quelconque (comme une entrée filtrée dans une API Web).
Jim Stewart

19
À titre de suivi, vous pouvez également le faire getattr(MyModelClass, column_string).desc()si vous avez une chaîne.
Jim Stewart

9
@JimStewart et pour être passé dans la direction, j'ai fini par utiliser:qry.order_by(getattr(getattr(Song, sort_by), sort_dir)())
Tjorriemorrie

1
Vous pouvez également l'utiliser si vous avez étiqueté votre sortie et que vous
triez

28

Vous pouvez utiliser la .desc()fonction dans votre requête comme ceci

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

Cette commande se fera par montant décroissant ou

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

Utilisation de la fonction desc de 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)
)
)

Pour les documents officiels, veuillez utiliser le lien ou consulter l'extrait ci-dessous

sqlalchemy.sql.expression.desc (colonne) Produisez un élément de clause ORDER BY décroissant.

par exemple:

from sqlalchemy import desc

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

produira SQL comme:

SELECT id, name FROM user ORDER BY name DESC

La fonction desc () est une version autonome de la méthode ColumnElement.desc () disponible sur toutes les expressions SQL, par exemple:

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

Colonne Paramètres - Un ColumnElement (par exemple une expression SQL scalaire) avec lequel appliquer l'opération desc ().

Voir également

asc ()

nullsfirst ()

nullslast ()

Select.order_by ()


5
comment est-ce pas un doublon de stackoverflow.com/a/4187279/2718295
cowbert

12

Tu peux essayer: .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

Complémentaire à la réponse @Radu, Comme en SQL, vous pouvez ajouter le nom de la table dans le paramètre si vous avez plusieurs tables avec le même attribut.

.order_by("TableName.name desc")

Cela ne nécessite-t-il pas d'encapsuler la chaîne par text ()?
Glutexo

Attention, cela provoque une erreur dans SQLAlchemy> 1.3, un avertissement dans les versions inférieures
Checo R
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.