Функция undefer
Функция undefer отменяет действие отложенной загрузки
для указанных атрибутов модели. Когда колонка помечена
как отложенная (через defer или load_only),
она не загружается из базы данных по умолчанию.
Функция undefer позволяет принудительно
загрузить эти колонки в конкретном запросе.
Первым параметром передаётся имя атрибута или сама колонка.
Синтаксис
undefer(key, [raiseload])
Пример
Давайте создадим модель и отложим загрузку
колонки text, а затем отменим ее
с помощью undefer:
from sqlalchemy import create_engine, String, Text
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
from sqlalchemy.orm import defer, undefer
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(50))
text: Mapped[str] = mapped_column(Text)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article', text='some text')
session.add(article)
session.commit()
with Session(engine) as session:
res = session.query(Article).options(
defer(Article.text)
).first()
print(res.__dict__)
Результат выполнения кода:
{'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x...>, 'id': 1, 'title': 'article'}
Пример
Теперь отменим отложенную загрузку с помощью
функции undefer:
from sqlalchemy import create_engine, String, Text
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
from sqlalchemy.orm import defer, undefer
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(50))
text: Mapped[str] = mapped_column(Text)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article', text='some text')
session.add(article)
session.commit()
with Session(engine) as session:
res = session.query(Article).options(
defer(Article.text),
undefer(Article.text)
).first()
print(res.__dict__)
Результат выполнения кода:
{'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x...>, 'id': 1, 'title': 'article', 'text': 'some text'}
Смотрите также
-
функцию
defer,
которая откладывает загрузку атрибута -
функцию
undefer_group,
которая отменяет отложенную загрузку группы -
функцию
load_only,
которая загружает только указанные колонки -
функцию
selectinload,
которая загружает связи через отдельный запрос