Метод reduce_columns
Метод reduce_columns класса Select
возвращает новый объект Select, в котором список
выбираемых колонок сокращён до минимально необходимого
набора. Метод анализирует колонки, уже присутствующие
в выражении, и удаляет дубликаты, а также колонки,
которые не участвуют в выборке напрямую. Это бывает
полезно при построении сложных запросов, когда нужно
убрать лишние колонки, добавленные ранее через
add_columns или другими методами.
Метод не принимает обязательных параметров и возвращает
новый объект Select, не изменяя исходный.
По умолчанию метод учитывает только колонки,
присутствующие в списке выборки, и оставляет
уникальные из них.
Синтаксис
select_stmt.reduce_columns()
Пример
Давайте создадим модель Article и построим
запрос с дублирующимися колонками, а затем применим
метод reduce_columns:
from sqlalchemy import create_engine, select
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)
stmt = select(Article.id, Article.title, Article.id, Article.text)
reduced = stmt.reduce_columns()
with Session(engine) as session:
res = session.execute(reduced).all()
print(res)
Результат выполнения кода:
[]
Пример
Давайте посмотрим на итоговый SQL-запрос, который
формируется после применения метода reduce_columns:
from sqlalchemy import create_engine, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
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:')
stmt = select(Article.id, Article.title, Article.id, Article.text)
reduced = stmt.reduce_columns()
print(reduced)
Итоговый SQL запрос:
SELECT articles.id, articles.title, articles.text
FROM articles
Пример
Давайте применим метод reduce_columns к запросу,
в котором колонки добавлены через add_columns:
from sqlalchemy import create_engine, select
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(Article(title='article', text='text', status='active', num=1))
session.commit()
stmt = select(Article.id).add_columns(Article.title, Article.title)
reduced = stmt.reduce_columns()
res = session.execute(reduced).all()
print(res)
Результат выполнения кода:
[(1, 'article')]
Смотрите также
-
класс
Select,
который представляет SQL-запрос SELECT -
метод
add_columns,
который добавляет колонки в список выборки -
метод
with_only_columns,
который заменяет список выбираемых колонок -
метод
select_from,
который задаёт источник выборки