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.

AP257
la source

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

Meule
la source
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
339
from sqlalchemy import desc
someselect.order_by(desc(table1.mycol))

Utilisation de @ jpmc26

AP257
la source
15
Utilisation: someselect.order_by(desc(table1.mycol))(Tiré de la documentation .) ... parce que je ne l'ai pas remarqué dans votre question.
jpmc26
1
Les documents ont une nouvelle URL
Hughes
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.

Radu
la source
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 ()

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