Метод 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