Функция any_
Функция any_ создает выражение
ANY, которое проверяет, удовлетворяет ли
хотя бы один элемент массива или результат
подзапроса заданному условию. Первым
параметром функция принимает массив или
подзапрос, с которым сравнивается значение.
Функция часто используется вместе с
операторами сравнения для поиска записей
по списку значений.
Синтаксис
any_(array_or_subquery)
Пример
Давайте создадим простое выражение
ANY для массива чисел:
from sqlalchemy import any_, literal, select
stmt = select(literal(5) == any_(literal([1, 2, 5, 7])))
print(stmt)
Результат выполнения кода:
SELECT :param_1 = ANY (:param_2)
Пример
Давайте используем функцию any_
для фильтрации записей из таблицы
articles по списку значений:
from sqlalchemy import create_engine, any_, select, literal
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()
stmt = select(Article).where(
Article.id == any_(literal([1, 3]))
)
res = session.scalars(stmt).all()
print([a.title for a in res])
Результат выполнения кода:
['article 1', 'article 3']
Пример
Давайте применим функцию any_
с подзапросом для поиска статей,
у которых есть связанные записи:
from sqlalchemy import create_engine, any_, 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]
status: Mapped[str]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article 1', status='published'),
Article(title='article 2', status='draft'),
Article(title='article 3', status='published'),
])
session.commit()
subq = select(Article.id).where(Article.status == 'published')
stmt = select(Article).where(Article.id == any_(subq))
res = session.scalars(stmt).all()
print([a.title for a in res])
Результат выполнения кода:
['article 1', 'article 3']