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

Метод from_statement

Метод from_statement класса Select позволяет построить ORM-запрос на основе произвольной текстовой SQL-строки. Первым параметром метод принимает объект TextClause, созданный функцией text, либо обычную строку с SQL-запросом. Такой подход удобен, когда нужно выполнить сложный SQL-запрос, который трудно или неудобно собирать через конструктор запросов.

Синтаксис

Select.from_statement(statement)

Пример

Давайте создадим модель и выполним простой SQL-запрос через from_statement:

from sqlalchemy import create_engine, text from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session from sqlalchemy import select 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), ]) session.commit() stmt = select(Article).from_statement( text('SELECT * FROM articles WHERE status = :status') ) res = session.execute(stmt, {'status': 'active'}).scalars().all() print([article.title for article in res])

Результат выполнения кода:

['article 1', 'article 2']

Пример

Давайте выполним запрос с параметрами и отсортируем результаты через SQL:

from sqlalchemy import create_engine, text from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session from sqlalchemy import select 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=3), Article(title='article 2', text='text 2', status='active', num=1), Article(title='article 3', text='text 3', status='active', num=2), ]) session.commit() stmt = select(Article).from_statement( text('SELECT * FROM articles WHERE num > :min_num ORDER BY num') ) res = session.execute(stmt, {'min_num': 1}).scalars().all() print([article.num for article in res])

Результат выполнения кода:

[2, 3]

Пример

Давайте проверим, какой SQL-запрос формируется при вызове from_statement:

from sqlalchemy import create_engine, text from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column from sqlalchemy import select 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:') stmt = select(Article).from_statement( text('SELECT * FROM articles WHERE status = :status') ) print(stmt)

Результат выполнения кода:

"SELECT * FROM articles WHERE status = :status"

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

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