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.

AP257
fuente

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

Almiar
fuente
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

AP257
fuente
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.

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

anand tripathi
fuente
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()
Artem Baranov
fuente
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")
Miguel
fuente
¿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