РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
273 of 711 menu

Метод order_by

Метод order_by класса Query задает порядок сортировки строк в результирующем наборе. Первым параметром метод принимает выражение сортировки: колонку модели, функцию или текстовое SQL-выражение. По умолчанию сортировка выполняется по возрастанию. Для сортировки по убыванию используется функция desc, а для явного указания возрастания - функция asc. Метод можно вызывать несколько раз подряд или передавать несколько выражений сразу, тогда сортировка применяется последовательно.

Синтаксис

Query.order_by(*criterion)

Пример

Давайте создадим модель и таблицу, а затем отсортируем статьи по заголовку в порядке возрастания:

from sqlalchemy import create_engine, String from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] text: Mapped[str] status: Mapped[str] num: Mapped[int] engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: session.add_all([ Article(title='sqlite', text='about sqlite', status='active', num=3), Article(title='article', text='about article', status='active', num=1), Article(title='user', text='about user', status='draft', num=2), ]) session.commit() res = session.query(Article).order_by(Article.title).all() for article in res: print(article.title)

Результат выполнения кода:

'article' 'sqlite' 'user'

Пример

Давайте отсортируем статьи по числу num в порядке убывания с помощью функции desc:

from sqlalchemy import create_engine, desc from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] text: Mapped[str] status: Mapped[str] num: Mapped[int] engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: session.add_all([ Article(title='sqlite', text='about sqlite', status='active', num=3), Article(title='article', text='about article', status='active', num=1), Article(title='user', text='about user', status='draft', num=2), ]) session.commit() res = session.query(Article).order_by(desc(Article.num)).all() for article in res: print(article.num)

Результат выполнения кода:

3 2 1

Пример

Давайте зададим сортировку сразу по двум колонкам: сначала по status по возрастанию, затем по num по убыванию:

from sqlalchemy import create_engine, desc from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] text: Mapped[str] status: Mapped[str] num: Mapped[int] engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: session.add_all([ Article(title='sqlite', text='about sqlite', status='active', num=3), Article(title='article', text='about article', status='active', num=1), Article(title='user', text='about user', status='draft', num=2), ]) session.commit() res = session.query(Article).order_by(Article.status, desc(Article.num)).all() for article in res: print(article.status, article.num)

Результат выполнения кода:

'active' 3 'active' 1 'draft' 2

Пример

Давайте посмотрим итоговый SQL-запрос, который генерирует метод order_by:

from sqlalchemy import create_engine from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] text: Mapped[str] status: Mapped[str] num: Mapped[int] engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: query = session.query(Article).order_by(Article.title) print(query)

Итоговый SQL запрос:

SELECT articles.id AS articles_id, articles.title AS articles_title, articles.text AS articles_text, articles.status AS articles_status, articles.num AS articles_num FROM articles ORDER BY articles.title

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

  • класс Query,
    который представляет объект запроса
  • метод filter,
    который накладывает условие на выборку
  • метод limit,
    который ограничивает число строк
  • метод offset,
    который пропускает заданное число строк
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить