6

SQLAlchemy: Как использовать ORDER BY по убыванию?

1

Как я могу использовать сортировку по убыванию в запросе SQLAlchemy, подобном следующему?

Этот запрос работает, но возвращает результаты в порядке возрастания:

query = (model.Session.query(model.Entry)
        .join(model.ClassificationItem)
        .join(model.EnumerationValue)
        .filter_by(id=c.row.id)
        .order_by(model.Entry.amount)  # Эта строка :)
        )

Если я попробую сделать так:

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

то получаю ошибку: NameError: global name 'desc' is not defined.

Как правильно реализовать сортировку по убыванию в данном случае?

3 ответ(ов)

1

Одним из вариантов, который вы можете рассмотреть, является использование следующего кода:

from sqlalchemy.sql import text
...
.order_by(text("name desc"))

Это приведет к следующему SQL-запросу: ORDER BY name desc. Однако стоит отметить, что недостатком этого подхода является явное указание имени столбца в операции сортировки.

0

Вы можете попробовать использовать метод .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()

В данном коде мы создаем сессию, задаем имя клиента для фильтрации, выбираем записи из таблицы ClientTotal, фильтруем по имени клиента и сортируем результаты по полю id в порядке убывания. После этого мы выводим идентификаторы всех найденных записей. Не забудьте закрыть сессию после завершения работы, чтобы избежать утечек ресурсов.

0

Дополняя ответ @Radu, стоит отметить, что в SQL вы можете указать имя таблицы в параметре, если у вас есть несколько таблиц с одинаковым атрибутом.

.order_by("TableName.name desc")
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь