2010-11-15 24 views
263

¿Cómo puedo usar ORDER BY descending en una consulta SQLAlchemy como la siguiente?SQLAlchemy ¿ORDEN AL DESCENDER?

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

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

en cuando me siento: NameError: global name 'desc' is not defined.

Respuesta

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

Usage de @ jpmc26

+11

Uso: 'someselect.order_by (desc (table1.mycol))' (Tomado de [los documentos] (http://docs.sqlalchemy.org/en/rel_0_7/core/expression_api.html#sqlalchemy.sql.expression.desc).) ... porque por mi parte no lo noté en tu pregunta. – jpmc26

451

Así como un FYI, también puede especificar esas cosas como atributos de la columna. Por ejemplo, podría haber hecho:

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

Esto es útil ya que se puede utilizar en otros lugares, como en una definición de relación, etc.

+11

también evita una 'importación'. –

+1

¿Hay una referencia de API para esto, sería bueno saber qué más hay disponible? –

+0

¡Esta solución funcionó como un encanto para mí! ¡gracias! –

50

Otra cosa que puede hacer es:

.order_by("name desc") 

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

+14

Esta es una solución potencialmente frágil en la que no se necesita una solución alternativa. – BlueBomber

+8

Esto es bueno si tiene la columna de ordenación en una cadena por cualquier razón, sin embargo (como entrada desinfectada en una API web). –

+15

Como seguimiento, también puede hacer 'getattr (MyModelClass, column_string) .desc()' si tiene una cadena. –

7

Usted puede hacer uso .desc() función de la consulta al igual que este

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 orden por cantidad en orden descendente