SQLAlchemy ENCOMENDA POR DESCIDA?

424

Como posso usar ORDER BY descendingem uma consulta SQLAlchemy como a seguir?

Esta consulta funciona, mas os retorna em ordem crescente:

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

Se eu tentar:

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

então eu recebo: NameError: global name 'desc' is not defined.

AP257
fonte

Respostas:

694

Assim como um FYI, você também pode especificar esses itens como atributos de coluna. Por exemplo, eu poderia ter feito:

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

Isso é útil, pois evita um import, e você pode usá-lo em outros lugares, como em uma definição de relação, etc.

Para mais informações, você pode consultar este

Rick
fonte
28
também evita um import.
Capi Etheriel
1
Existe uma referência de API para isso, seria legal saber o que mais está disponível?
John Mike
Obrigado por isso. Parece que está faltando na documentação oficial.
user3341078
1
A melhor resposta (no momento).
RodriKing
339
from sqlalchemy import desc
someselect.order_by(desc(table1.mycol))

Uso de @ jpmc26

AP257
fonte
15
Uso: someselect.order_by(desc(table1.mycol))(Retirado dos documentos .) ... porque eu nem percebi na sua pergunta.
precisa saber é
1
Os documentos têm um novo URL
hughes
73

Outra coisa que você pode fazer é:

.order_by("name desc")

Isso resultará em: ORDER BY name desc. A desvantagem aqui é o nome explícito da coluna usada em ordem por.

Radu
fonte
25
Esta é uma solução potencialmente quebradiça, em que não é necessária uma solução alternativa.
BlueBomber
13
Isso é bom se você tiver a coluna de classificação em uma string por qualquer motivo (como entrada higienizada em uma API da web).
Jim Stewart
19
Como acompanhamento, você também pode fazer getattr(MyModelClass, column_string).desc()se tiver uma string.
Jim Stewart
9
@JimStewart e por passar na direção, acabei usando:qry.order_by(getattr(getattr(Song, sort_by), sort_dir)())
Tjorriemorrie
1
Você também pode usar isso se você tiver marcado a sua saída e estão classificando por uma coluna computada em vez de uma coluna de modelo
boatcoder
28

Você pode usar a .desc()função na sua consulta assim

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

Isso ordenará pelo valor em ordem decrescente ou

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

Uso da função 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 oficiais, use o link ou verifique o snippet abaixo

sqlalchemy.sql.expression.desc (coluna) Produz um elemento da cláusula ORDER BY descendente.

por exemplo:

from sqlalchemy import desc

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

produzirá SQL como:

SELECT id, name FROM user ORDER BY name DESC

A função desc () é uma versão independente do método ColumnElement.desc () disponível em todas as expressões SQL, por exemplo:

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

Coluna de parâmetros - Um ColumnElement (por exemplo, expressão SQL escalar) com o qual aplicar a operação desc ().

Veja também

asc ()

nullsfirst ()

nullslast ()

Select.order_by ()

anand tripathi
fonte
5
como isso é não uma duplicata de stackoverflow.com/a/4187279/2718295
cowbert
12

Podes tentar: .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
fonte
0

Complementar na resposta do @Radu, como no SQL, você pode adicionar o nome da tabela no parâmetro se tiver muitas tabelas com o mesmo atributo.

.order_by("TableName.name desc")
Michael
fonte
Isso não requer a quebra da string por text ()?
Glutexo 21/05/19
Tome cuidado, pois isso causa um erro no SQLAlchemy> 1.3, um aviso nas versões mais baixas #
Checo R