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.

AP257
источник

Ответы:

694

Так же, как к сведению, вы также можете указать эти вещи в качестве атрибутов столбца. Например, я мог бы сделать:

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

Это удобно, так как избегает import, и вы можете использовать его в других местах, таких как определение отношений и т. Д.

Для получения дополнительной информации, вы можете отослать это

стог
источник
28
это также избегает import.
Capi Etheriel
1
Есть ли ссылка на API для этого, было бы здорово узнать, что еще доступно?
Джон Майк
Спасибо за это. Кажется, это отсутствует в официальной документации.
user3341078
1
Лучший ответ (на данный момент).
RodriKing
339
from sqlalchemy import desc
someselect.order_by(desc(table1.mycol))

Использование от @ jpmc26

AP257
источник
15
Использование: someselect.order_by(desc(table1.mycol))(взято из документации .) ... потому что я не заметил этого в вашем вопросе.
jpmc26
1
Документы имеют новый URL
Хью
73

Еще одна вещь, которую вы можете сделать:

.order_by("name desc")

Это приведет к: ORDER BY name desc. Недостатком здесь является явное имя столбца, используемое в порядке.

Radu
источник
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 (column) Создает нисходящий элемент предложения 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())

Столбец параметров - элемент ColumnElement (например, скалярное выражение SQL), с помощью которого применяется операция desc ().

Смотрите также

по возрастанию ()

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")
Майкл
источник
Разве это не требует переноса строки с помощью text ()?
Glutexo
Будьте осторожны, это вызывает ошибку в SQLAlchemy> 1.3, предупреждение в более низких версиях
Checo R