Функция exists
Функция exists создает SQL-выражение
EXISTS, которое проверяет, возвращает ли
подзапрос хотя бы одну строку. Функция принимает
первым параметром выражение запроса или подзапрос.
Результатом является булево значение: True,
если подзапрос вернул хотя бы одну строку,
и False в противном случае.
Функция часто используется в конструкциях
WHERE и HAVING для фильтрации
основного запроса по наличию связанных данных.
Синтаксис
exists(select_stmt)
Пример
Давайте создадим таблицу articles и проверим,
существуют ли в ней статьи:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, exists
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String),
)
metadata.create_all(engine)
with engine.connect() as conn:
stmt = select(exists().where(articles.c.status == 'published'))
res = conn.execute(stmt).scalar()
print(res)
Результат выполнения кода:
False
Пример
Давайте добавим статью и снова проверим существование:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, insert, select, exists
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String),
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(insert(articles).values(title='article', status='published'))
conn.commit()
stmt = select(exists().where(articles.c.status == 'published'))
res = conn.execute(stmt).scalar()
print(res)
Результат выполнения кода:
True
Пример
Давайте используем exists в атрибуте
where основного запроса для фильтрации:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, insert, select, exists
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String),
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(insert(articles), [
{'title': 'article 1', 'status': 'published'},
{'title': 'article 2', 'status': 'draft'},
])
conn.commit()
subq = select(articles.c.id).where(articles.c.status == 'draft')
stmt = select(articles.c.title).where(exists(subq))
res = conn.execute(stmt).fetchall()
print(res)
Результат выполнения кода:
[('article 1',), ('article 2',)]
Пример
Давайте посмотрим итоговый SQL-запрос, который
генерирует функция exists:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, exists
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String),
)
subq = select(articles.c.id).where(articles.c.status == 'published')
stmt = select(articles.c.title).where(exists(subq))
print(stmt)
Итоговый SQL запрос:
SELECT articles.title
FROM articles
WHERE EXISTS (SELECT articles.id
FROM articles
WHERE articles.status = :status_1)