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

Функция undefer_group

Функция undefer_group возвращает опцию загрузки, которая отменяет отложенную загрузку для всех колонок, объединённых в группу через параметр group функции deferred. Первым параметром функция принимает имя группы в виде строки. Опция применяется в методе options запроса и заставляет SQLAlchemy загрузить все колонки указанной группы сразу, а не лениво.

Синтаксис

undefer_group(name)

Пример

Давайте создадим модель Article с колонками id, title, text и status, причём колонки text и status отложим и объединим в группу 'content':

from sqlalchemy import create_engine, String, Text from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, deferred, undefer_group, Session class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(100)) text: Mapped[str] = mapped_column(Text, deferred=True, deferred_group='content') status: Mapped[str] = mapped_column(String(50), deferred=True, deferred_group='content') engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: article = Article(id=1, title='article', text='article text', status='published') session.add(article) session.commit() res = session.query(Article).options(undefer_group('content')).first() print(res.text) print(res.status)

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

"article text" "published"

Пример

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

from sqlalchemy import create_engine, String, Text from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, deferred, undefer_group, Session class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(100)) text: Mapped[str] = mapped_column(Text, deferred=True, deferred_group='content') status: Mapped[str] = mapped_column(String(50), deferred=True, deferred_group='content') engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: article = Article(id=1, title='article', text='article text', status='published') session.add(article) session.commit() res = session.query(Article).first() print(res.title) print(res.text)

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

"article" "article text"

Пример

Давайте загрузим группу 'content' через опцию undefer_group и выведем итоговый SQL-запрос:

from sqlalchemy import create_engine, String, Text from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, deferred, undefer_group, Session class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(100)) text: Mapped[str] = mapped_column(Text, deferred=True, deferred_group='content') status: Mapped[str] = mapped_column(String(50), deferred=True, deferred_group='content') engine = create_engine('sqlite:///:memory:', echo=True) Base.metadata.create_all(engine) with Session(engine) as session: article = Article(id=1, title='article', text='article text', status='published') session.add(article) session.commit() res = session.query(Article).options(undefer_group('content')).first() print(res.text)

Итоговый SQL запрос:

SELECT articles.id AS articles_id, articles.title AS articles_title, articles.text AS articles_text, articles.status AS articles_status FROM articles

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

  • функцию defer,
    которая откладывает загрузку колонки
  • функцию undefer,
    которая отменяет отложенную загрузку колонки
  • функцию load_only,
    которая загружает только указанные колонки
  • функцию selectinload,
    которая загружает связи отдельным запросом
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить