Метод where класса Select
Метод where класса Select добавляет
условие фильтрации к SQL-запросу. Он принимает
одно или несколько условий, которые объединяются
оператором AND. Метод возвращает новый объект
Select, поэтому его можно вызывать цепочкой
для добавления нескольких условий.
Синтаксис
select(...).where(condition)
select(...).where(condition1, condition2, ...)
Пример
Давайте создадим модель и выберем статьи
со статусом 'published':
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='published', num=1),
Article(title='article 2', text='text 2', status='draft', num=2),
Article(title='article 3', text='text 3', status='published', num=3),
])
session.commit()
stmt = select(Article).where(Article.status == 'published')
res = session.scalars(stmt).all()
for article in res:
print(article.title)
Результат выполнения кода:
article 1
article 3
Пример
Давайте передадим несколько условий в метод
where, которые объединятся оператором
AND:
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='published', num=1),
Article(title='article 2', text='text 2', status='published', num=5),
Article(title='article 3', text='text 3', status='draft', num=10),
])
session.commit()
stmt = select(Article).where(
Article.status == 'published',
Article.num > 3,
)
res = session.scalars(stmt).all()
for article in res:
print(article.title)
Результат выполнения кода:
article 2
Итоговый SQL запрос:
SELECT articles.id, articles.title, articles.text, articles.status, articles.num
FROM articles
WHERE articles.status = 'published' AND articles.num > 3
Пример
Давайте вызовем метод where несколько раз
цепочкой, что также объединит условия оператором
AND:
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='published', num=1),
Article(title='article 2', text='text 2', status='published', num=5),
Article(title='article 3', text='text 3', status='draft', num=10),
])
session.commit()
stmt = (
select(Article)
.where(Article.status == 'published')
.where(Article.num > 3)
)
res = session.scalars(stmt).all()
for article in res:
print(article.title)
Результат выполнения кода:
article 2
Пример
Давайте используем оператор or_ для
объединения условий по OR:
from sqlalchemy import create_engine, select, or_
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='published', num=1),
Article(title='article 2', text='text 2', status='draft', num=5),
Article(title='article 3', text='text 3', status='draft', num=10),
])
session.commit()
stmt = select(Article).where(
or_(Article.status == 'published', Article.num > 6)
)
res = session.scalars(stmt).all()
for article in res:
print(article.title)
Результат выполнения кода:
article 1
article 3
Итоговый SQL запрос:
SELECT articles.id, articles.title, articles.text, articles.status, articles.num
FROM articles
WHERE articles.status = 'published' OR articles.num > 6