Функция and_
Функция and_ объединяет переданные
условия в одно логическое выражение,
соединяя их оператором AND.
Функция принимает произвольное число
аргументов, каждый из которых является
условием или выражением. Возвращается
объект, который можно передать в метод
where запроса SELECT.
Синтаксис
and_(*clauses)
Пример
Давайте объединим два условия с помощью
функции and_:
from sqlalchemy import create_engine, and_, 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='draft', num=2),
Article(title='article 3', text='text 3', status='active', num=3),
])
session.commit()
stmt = select(Article.title).where(
and_(Article.status == 'active', Article.num > 1)
)
res = session.execute(stmt).scalars().all()
print(res)
Результат выполнения кода:
['article 3']
Пример
Итоговый SQL-запрос при использовании
функции and_ будет таким:
SELECT articles.title
FROM articles
WHERE articles.status = 'active' AND articles.num > 1
Пример
Давайте передадим в функцию and_
три условия одновременно:
from sqlalchemy import create_engine, and_, 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=5),
Article(title='article 3', text='text 3', status='draft', num=10),
])
session.commit()
stmt = select(Article.title).where(
and_(
Article.status == 'active',
Article.num > 1,
Article.num < 10,
)
)
res = session.execute(stmt).scalars().all()
print(res)
Результат выполнения кода:
['article 2']
Пример
Давайте используем функцию and_
вместе с функцией or_ для
построения составного условия:
from sqlalchemy import create_engine, and_, or_, 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='draft', num=5),
Article(title='article 3', text='text 3', status='active', num=10),
])
session.commit()
stmt = select(Article.title).where(
and_(
Article.status == 'active',
or_(Article.num < 2, Article.num > 8),
)
)
res = session.execute(stmt).scalars().all()
print(res)
Результат выполнения кода:
['article 1', 'article 3']