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

Метод options класса Select

Метод options класса Select добавляет к запросу одну или несколько опций загрузки ORM. Опции управляют тем, как загружаются связанные объекты и отдельные атрибуты: например, жадной или ленивой загрузкой, объединением в один SQL-запрос или отдельными запросами. Первым параметром метод принимает одну опцию загрузки, а дополнительные опции можно передать следующими позиционными аргументами.

Опции загрузки импортируются из модуля sqlalchemy.orm и включают joinedload, selectinload, subqueryload, lazyload, noload, raiseload, load_only, defer, undefer и другие. Метод возвращает новый объект Select, поэтому его удобно объединять в цепочки вызовов.

Синтаксис

select(...).options(option, *additional_options)

Пример

Давайте создадим две связанные модели и применим опцию joinedload, чтобы загрузить статьи вместе с их авторами одним запросом:

from sqlalchemy import create_engine, ForeignKey, select from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship, Session from sqlalchemy.orm import joinedload class Base(DeclarativeBase): pass class User(Base): __tablename__ = 'users' id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] articles: Mapped[list['Article']] = relationship(back_populates='author') class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] user_id: Mapped[int] = mapped_column(ForeignKey('users.id')) author: Mapped['User'] = relationship(back_populates='articles') engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: user = User(name='user') user.articles = [Article(title='article 1'), Article(title='article 2')] session.add(user) session.commit() stmt = select(Article).options(joinedload(Article.author)) res = session.scalars(stmt).all() for article in res: print(article.title, '->', article.author.name)

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

article 1 -> user article 2 -> user

Пример

Давайте применим опцию load_only, чтобы загрузить только выбранные столбцы модели:

from sqlalchemy import create_engine, select from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session from sqlalchemy.orm import load_only class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] text: Mapped[str] engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: session.add(Article(title='article', text='some text')) session.commit() stmt = select(Article).options(load_only(Article.title)) res = session.scalars(stmt).all() for article in res: print(article.title)

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

"article"

Пример

Давайте объединим несколько опций загрузки в одном вызове метода options:

from sqlalchemy import create_engine, ForeignKey, select from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship, Session from sqlalchemy.orm import joinedload, load_only class Base(DeclarativeBase): pass class User(Base): __tablename__ = 'users' id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] articles: Mapped[list['Article']] = relationship(back_populates='author') class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] text: Mapped[str] user_id: Mapped[int] = mapped_column(ForeignKey('users.id')) author: Mapped['User'] = relationship(back_populates='articles') engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: user = User(name='user') user.articles = [Article(title='article', text='some text')] session.add(user) session.commit() stmt = select(Article).options( joinedload(Article.author), load_only(Article.title), ) res = session.scalars(stmt).all() for article in res: print(article.title, '->', article.author.name)

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

article -> user

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

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