Метод any_ класса ColumnElement
Метод any_ класса ColumnElement создает
выражение ANY, которое проверяет, удовлетворяет ли
хотя бы один элемент правой части условию сравнения.
Чаще всего используется с подзапросами и массивами
PostgreSQL. Метод принимает первым параметром
подзапрос или массив, с которым сравнивается
значение столбца.
Синтаксис
ColumnElement.any_(other)
Пример
Давайте создадим модель Article и проверим
работу метода any_ с подзапросом:
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 1', text='text 1', status='active', num=1),
Article(title='article 2', text='text 2', status='active', num=2),
Article(title='article 3', text='text 3', status='archive', num=3),
])
session.commit()
subq = select(Article.num).where(Article.status == 'active')
stmt = select(Article).where(Article.num == Article.num.any_(subq))
res = session.execute(stmt).scalars().all()
for article in res:
print(article.title)
Результат выполнения кода:
"article 1"
"article 2"
Пример
Давайте используем метод any_ вместе с
оператором сравнения для поиска статьи с
определенным номером:
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 1', text='text 1', status='active', num=1),
Article(title='article 2', text='text 2', status='active', num=2),
Article(title='article 3', text='text 3', status='archive', num=3),
])
session.commit()
subq = select(Article.num).where(Article.status == 'archive')
stmt = select(Article).where(Article.num == Article.num.any_(subq))
res = session.execute(stmt).scalars().all()
for article in res:
print(article.title)
Результат выполнения кода:
"article 3"
Пример
Давайте посмотрим итоговый SQL-запрос, который
генерирует метод any_:
from sqlalchemy import create_engine, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
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]
subq = select(Article.num).where(Article.status == 'active')
stmt = select(Article).where(Article.num == Article.num.any_(subq))
print(stmt)
Итоговый SQL запрос:
SELECT articles.id, articles.title, articles.text, articles.status, articles.num
FROM articles
WHERE articles.num = ANY (SELECT articles.num
FROM articles
WHERE articles.status = :status_1)
Смотрите также
-
метод
all_,
который создает выражение ALL для сравнения со всеми элементами -
метод
in_,
который проверяет вхождение значения в список -
метод
notin_,
который проверяет отсутствие значения в списке -
класс
ColumnElement,
который представляет элемент столбца в SQLAlchemy