Функция except_
Функция except_ выполняет операцию
исключения множеств: она возвращает строки
из первого запроса, которые отсутствуют
во втором запросе. Это аналог SQL-оператора
EXCEPT. Функция принимает два или более
запросов select и возвращает новый
запрос. По умолчанию дубликаты строк
удаляются, для сохранения дубликатов
используется функция except_all.
Синтаксис
except_(*selects)
Пример
Давайте создадим две таблицы и получим строки из первой, которых нет во второй:
from sqlalchemy import create_engine, select, except_
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]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article 1'),
Article(title='article 2'),
Article(title='article 3')
])
session.commit()
q1 = select(Article.title).where(Article.id < 3)
q2 = select(Article.title).where(Article.id == 1)
res = session.execute(except_(q1, q2)).scalars().all()
print(res)
Результат выполнения кода:
['article 2']
Пример
Давайте исключим строки из двух запросов одновременно:
from sqlalchemy import create_engine, select, except_
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]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article 1'),
Article(title='article 2'),
Article(title='article 3'),
Article(title='article 4')
])
session.commit()
q1 = select(Article.title).where(Article.id < 5)
q2 = select(Article.title).where(Article.id == 1)
q3 = select(Article.title).where(Article.id == 2)
res = session.execute(except_(q1, q2, q3)).scalars().all()
print(res)
Результат выполнения кода:
['article 3', 'article 4']
Пример
Давайте посмотрим итоговый SQL-запрос,
который генерирует функция except_:
from sqlalchemy import create_engine, select, except_
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]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
q1 = select(Article.title).where(Article.id < 5)
q2 = select(Article.title).where(Article.id == 1)
print(except_(q1, q2))
Итоговый SQL запрос:
SELECT articles.title
FROM articles
WHERE articles.id < 5
EXCEPT
SELECT articles.title
FROM articles
WHERE articles.id = 1
Смотрите также
-
функцию
except_all,
которая выполняет исключение без удаления дубликатов -
функцию
union,
которая объединяет результаты запросов -
функцию
intersect,
которая возвращает общие строки запросов -
функцию
select,
которая создает запрос на выборку данных