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

Событие load

Событие load относится к секции event и срабатывает в момент, когда ORM загружает атрибуты объекта из базы данных. Это происходит при первом обращении к атрибутам экземпляра, при выполнении запроса или при отложенной загрузке связанных данных. Обработчик получает целевой объект, контекст загрузки и ранее загруженное значение атрибута.

Синтаксис

from sqlalchemy import event @event.listens_for(Target, 'load') def receive_load(target, context): pass

Пример

Давайте зарегистрируем обработчик события load для модели Article и выведем сообщение при загрузке объекта из базы данных:

from sqlalchemy import create_engine, String from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session from sqlalchemy import event class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(100)) @event.listens_for(Article, 'load') def receive_load(target, context): print('Loaded article:', target.id, target.title) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: session.add(Article(id=1, title='article')) session.commit() session.expire_all() res = session.get(Article, 1) print(res.title)

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

"Loaded article: 1 article" "article"

Пример

Событие load можно использовать для отложенной загрузки связанных данных. Давайте посмотрим, как это работает с ленивой загрузкой через selectinload:

from sqlalchemy import create_engine, String, ForeignKey from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session, relationship from sqlalchemy import event class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(100)) @event.listens_for(Article, 'load') def receive_load(target, context): print('Article loaded:', target.title) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: session.add(Article(id=1, title='article')) session.commit() session.expire_all() stmt = session.query(Article) res = stmt.first() print(res.title)

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

"Article loaded: article" "article"

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

  • декоратор listens_for,
    который регистрирует обработчик события
  • функцию listen,
    которая подписывает функцию на событие
  • событие refresh,
    которое срабатывает при обновлении объекта
  • событие expire,
    которое срабатывает при устаревании объекта
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить