ЗАМОВЛЕННЯ SQLAlchemy ДЕКАНДАЦІЄЮ?


424

Як я можу використовувати ORDER BY descendingу запиті SQLAlchemy на зразок наступного?

Цей запит працює, але повертає їх у порядку зростання:

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

Якщо я спробую:

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

Потім я отримую: NameError: global name 'desc' is not defined.

Відповіді:


692

Як і FYI, ви також можете вказати ці речі як атрибути стовпців. Наприклад, я міг би зробити:

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

Це зручно, оскільки це уникає import, і ви можете використовувати його в інших місцях, наприклад, у визначенні відносин тощо.

Для отримання додаткової інформації ви можете звернутися до цього


28
це також уникає import.
Capi Etheriel

1
Чи є посилання на API для цього, було б здорово знати, що ще є?
Джон Майк

Дякую за це. Здається, його немає в офіційній документації.
користувач3341078

1
Найкраща відповідь (на даний момент).
RodriKing



73

Ще одне, що ви можете зробити:

.order_by("name desc")

Це призведе до: ЗАМОВЛЕННЯ НАЗВ. Недоліком тут є явна назва стовпця, що використовується для того, щоб.


25
Це потенційно крихке рішення, де не потрібне рішення.
BlueBomber

13
Це добре, якщо ви маєте стовпець сортування в рядку з будь-якої причини, хоча (як санітоване введення у веб-API).
Джим Стюарт

19
У подальшому ви також можете зробити це, getattr(MyModelClass, column_string).desc()якщо у вас є рядок.
Джим Стюарт

9
@JimStewart і для проїзду в напрямку я закінчився з використанням:qry.order_by(getattr(getattr(Song, sort_by), sort_dir)())
Tjorriemorrie

1
Ви також можете скористатися цим, якщо ви позначили свій вихід і сортуєте за обчислюваним стовпцем замість стовпця моделі
boatcoder

28

Ви можете використовувати .desc()функцію у своєму запиті саме так

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

Це буде впорядковано за кількістю у порядку зменшення або

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

Використання функції 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)
)
)

Для офіційних документів перейдіть за посиланням або перевірте фрагмент нижче

sqlalchemy.sql.expression.desc (колонка) Створює низхідний елемент ORDER BY.

наприклад:

from sqlalchemy import desc

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

буде виробляти SQL у вигляді:

SELECT id, name FROM user ORDER BY name DESC

Функція desc () - це окрема версія методу ColumnElement.desc (), доступна для всіх SQL-виразів, наприклад:

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

Стовпець параметрів - стовпець Елемент (наприклад, скалярний вираз SQL), до якого слід застосувати операцію desc ().

Дивись також

asc ()

nullsfirst ()

nullslast ()

Select.order_by ()


5
як це не дублікат stackoverflow.com/a/4187279/2718295
cowbert

12

Ви можете спробувати: .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

Доповнення у відповіді @Radu. Як і в SQL, ви можете додати ім'я таблиці в параметр, якщо у вас багато таблиць з тим самим атрибутом.

.order_by("TableName.name desc")

Це не вимагає обгортання рядка за текстом ()?
Glutexo

Будьте уважні, це спричинить помилку в SQLAlchemy> 1.3, попередження в нижчих версіях
Checo R
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.