SQLAlchemy ZAMÓWIENIE W ZJEDNOCZENIU?


424

Jak mogę użyć ORDER BY descendingw zapytaniu SQLAlchemy w następujący sposób?

To zapytanie działa, ale zwraca je w kolejności rosnącej:

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

Jeśli spróbuję:

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

Następnie pojawia się: NameError: global name 'desc' is not defined.

Odpowiedzi:


692

Podobnie jak FYI, możesz również określić te rzeczy jako atrybuty kolumn. Na przykład mogłem zrobić:

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

Jest to przydatne, ponieważ pozwala uniknąć importi można go używać w innych miejscach, takich jak definicja relacji itp.

Aby uzyskać więcej informacji, możesz to sprawdzić


28
unika także import.
Capi Etheriel,

1
Czy jest do tego odniesienie API, fajnie byłoby wiedzieć, co jeszcze jest dostępne?
John Mike

Dzięki za to. Wygląda na to, że brakuje jej w oficjalnej dokumentacji.
user3341078,

1
Najlepsza odpowiedź (w tej chwili).
RodriKing



73

Inną rzeczą, którą możesz zrobić, jest:

.order_by("name desc")

Spowoduje to: ORDER BY name desc. Wadą jest tutaj jawna nazwa kolumny używana w kolejności przez.


25
Jest to potencjalnie kruche obejście, w którym obejście nie jest potrzebne.
BlueBomber,

13
Jest to miłe, jeśli z jakiegoś powodu masz kolumnę sortującą w ciągu znaków (jak oczyszczone dane wejściowe w internetowym interfejsie API).
Jim Stewart

19
Jako kontynuację możesz również zrobić, getattr(MyModelClass, column_string).desc()jeśli masz ciąg.
Jim Stewart

9
@JimStewart i do podania w kierunku skończyłem używając:qry.order_by(getattr(getattr(Song, sort_by), sort_dir)())
Tjorriemorrie,

1
Możesz tego również użyć, jeśli oznaczyłeś dane wyjściowe i sortujesz według kolumny obliczeniowej zamiast kolumny modelowej
Boatcoder

28

Możesz użyć .desc()funkcji w zapytaniu tak jak to

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

To uporządkuje według kwoty w kolejności malejącej lub

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

Korzystanie z funkcji desc 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)
)
)

W przypadku oficjalnych dokumentów skorzystaj z linku lub sprawdź poniższy fragment

sqlalchemy.sql.expression.desc (kolumna) Utwórz element malejącej klauzuli ORDER BY.

na przykład:

from sqlalchemy import desc

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

wygeneruje SQL jako:

SELECT id, name FROM user ORDER BY name DESC

Funkcja desc () jest samodzielną wersją metody ColumnElement.desc () dostępną dla wszystkich wyrażeń SQL, np .:

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

Parametry column - ColumnElement (np. Skalarne wyrażenie SQL), za pomocą którego można zastosować operację desc ().

Zobacz też

asc ()

nullsfirst ()

nullslast ()

Select.order_by ()


5
jak to nie jest duplikat stackoverflow.com/a/4187279/2718295
cowbert

12

Możesz spróbować: .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

Uzupełniające w odpowiedzi @Radu, Podobnie jak w SQL, możesz dodać nazwę tabeli do parametru, jeśli masz wiele tabel z tym samym atrybutem.

.order_by("TableName.name desc")

Czy to nie wymaga zawijania ciągu tekstowego ()?
Glutexo

Uważaj, aby spowodować błąd w SQLAlchemy> 1.3, ostrzeżenie w niższych wersjach
Checo R
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.