SQLAlchemy ORDEN POR DESCENDER?


424

¿Cómo puedo usar ORDER BY descendingen una consulta SQLAlchemy como la siguiente?

Esta consulta funciona, pero los devuelve en orden ascendente:

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 lo intento:

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

Entonces consigo: NameError: global name 'desc' is not defined.

Respuestas:


694

Al igual que para su información, también puede especificar esas cosas como atributos de columna. Por ejemplo, podría haber hecho:

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

Esto es útil ya que evita un import, y puede usarlo en otros lugares, como en una definición de relación, etc.

Para más información, puedes referir esto


28
También evita un import.
Capi Etheriel

1
¿Hay una referencia de API para esto, sería genial saber qué más hay disponible?
John Mike

Gracias por esto Parece que falta en la documentación oficial.
user3341078

1
La mejor respuesta (por el momento).
RodriKing


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

Uso de @ jpmc26


15
Uso: someselect.order_by(desc(table1.mycol))(Tomado de los documentos ) ... porque por mi parte no lo noté en su pregunta.
jpmc26

1
Docs tienen una nueva url
Hughes

73

Otra cosa que puedes hacer es:

.order_by("name desc")

Esto dará como resultado: ORDER BY name desc. La desventaja aquí es el nombre explícito de la columna utilizado en orden por.


25
Esta es una solución potencialmente frágil donde no se necesita una solución alternativa.
BlueBomber

13
Sin embargo, esto es bueno si tiene la columna de clasificación en una cadena por alguna razón (como la entrada desinfectada en una API web).
Jim Stewart

19
Como seguimiento, también puede hacerlo getattr(MyModelClass, column_string).desc()si tiene una cadena.
Jim Stewart

99
@JimStewart y por pasar en dirección terminé usando:qry.order_by(getattr(getattr(Song, sort_by), sort_dir)())
Tjorriemorrie

1
También puede utilizar esta opción si ha marcado la salida y está ordenando una columna calculada en lugar de una columna del modelo
boatcoder

28

Puede usar la .desc()función en su consulta así como así

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

Esto ordenará por cantidad en orden descendente 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 de la función 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)
)
)

Para documentos oficiales, utilice el enlace o consulte el fragmento a continuación

sqlalchemy.sql.expression.desc (columna) Produce un elemento descendente de la cláusula ORDER BY.

p.ej:

from sqlalchemy import desc

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

producirá SQL como:

SELECT id, name FROM user ORDER BY name DESC

La función desc () es una versión independiente del método ColumnElement.desc () disponible en todas las expresiones SQL, por ejemplo:

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

Columna de parámetros: un ColumnElement (p. Ej., Expresión SQL escalar) con el que aplicar la operación desc ().

Ver también

asc ()

nullsfirst ()

nullslast ()

Select.order_by ()


55
¿Cómo es que esto no es un duplicado de stackoverflow.com/a/4187279/2718295
cowbert

12

Puedes probar: .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

Complementario en @Radu answer, Al igual que en SQL, puede agregar el nombre de la tabla en el parámetro si tiene muchas tablas con el mismo atributo.

.order_by("TableName.name desc")

¿No requiere esto envolver la cadena por text ()?
Glutexo

Tenga cuidado porque causa un error en SQLAlchemy> 1.3, una advertencia en versiones inferiores
Checo R
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.