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

Метод exists

Метод exists класса Select создает подзапрос с конструкцией SQL EXISTS. Он возвращает объект Exists, который можно использовать в условиях других запросов. Метод не принимает обязательных параметров и вызывается у уже сформированного объекта Select. Результатом подзапроса является логическое значение: True, если хотя бы одна строка удовлетворяет условиям, и False в противном случае.

Синтаксис

select(...).exists()

Пример

Давайте создадим таблицу articles и проверим, существуют ли статьи с заголовком 'article':

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: article = Article( title='article', text='some text', status='published', num=1, ) session.add(article) session.commit() stmt = select(Article).where(Article.title == 'article') subq = stmt.exists() res = session.execute(select(subq)).scalar() print(res)

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

True

Пример

Давайте используем метод exists в условии where другого запроса, чтобы найти статьи, у которых есть связанные записи с тем же номером:

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_all([ Article(title='article', text='text 1', status='published', num=1), Article(title='article', text='text 2', status='draft', num=2), Article(title='user', text='text 3', status='published', num=1), ]) session.commit() subq = ( select(Article.id) .where(Article.num == 1) .exists() ) stmt = select(Article).where(subq) res = session.execute(stmt).scalars().all() for article in res: print(article.title, article.num)

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

article 1 user 1

Пример

Давайте проверим, что условие не выполняется, и метод exists вернет False:

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: article = Article( title='article', text='some text', status='published', num=1, ) session.add(article) session.commit() stmt = select(Article).where(Article.title == 'user') subq = stmt.exists() res = session.execute(select(subq)).scalar() print(res)

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

False

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

  • класс Select,
    который представляет SELECT-запрос
  • метод where,
    который добавляет условие фильтрации
  • метод subquery,
    который превращает запрос в подзапрос
  • метод cte,
    который создает общее табличное выражение
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить