Метод expire класса Session
Метод expire класса Session помечает
переданный объект устаревшим. Это означает, что
все его загруженные атрибуты сбрасываются, и при
следующем обращении к ним SQLAlchemy выполнит
новый SQL-запрос к базе данных, чтобы получить
актуальные значения. Метод принимает первым
параметром экземпляр модели, который нужно
пометить устаревшим.
Синтаксис
session.expire(instance)
Пример
Давайте создадим сессию, добавим статью и поместим ее в базу данных:
from sqlalchemy import create_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article 1')
session.add(article)
session.commit()
print(article.title)
Результат выполнения кода:
"article 1"
Пример
Теперь давайте изменим значение атрибута
напрямую и вызовем метод expire, чтобы
при следующем обращении данные загрузились
из базы заново:
from sqlalchemy import create_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article 1')
session.add(article)
session.commit()
article.title = 'article 2'
session.expire(article)
print(article.title)
Результат выполнения кода:
"article 1"
Как видите, несмотря на то, что мы присвоили
атрибуту новое значение, после вызова метода
expire объект был перезагружен из базы,
и мы снова получили исходное значение.
Пример
Давайте посмотрим, какой SQL-запрос выполняется при обращении к устаревшему объекту:
from sqlalchemy import create_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
engine = create_engine('sqlite:///:memory:', echo=True)
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article 1')
session.add(article)
session.commit()
session.expire(article)
print(article.title)
Итоговый SQL запрос:
SELECT articles.id AS articles_id, articles.title AS articles_title
FROM articles
WHERE articles.id = ?
Смотрите также
-
класс
Session,
который управляет жизненным циклом объектов -
метод
expire_all,
который помечает устаревшими все объекты сессии -
метод
refresh,
который немедленно перезагружает объект из базы -
атрибут
expire_on_commit,
который управляет автоматической пометкой после коммита