Функция 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,
которая загружает связи отдельным запросом