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