РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
211 of 711 menu

Метод 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

Смотрите также

  • класс Select,
    который представляет SQL-запрос SELECT
  • метод filter,
    который является синонимом метода where
  • метод filter_by,
    который фильтрует строки по именам полей
  • метод having,
    который добавляет условие к группировке
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить