Метод expire_all
Метод expire_all класса AsyncSession
помечает все объекты, находящиеся в сессии,
как устаревшие. Это означает, что при следующем
обращении к атрибутам любого из этих объектов
SQLAlchemy выполнит новый SQL-запрос к базе данных
для загрузки актуальных значений. Метод не принимает
параметров и не возвращает значения. Его удобно
использовать после массовых изменений в базе,
выполненных в обход сессии, чтобы гарантировать
чтение свежих данных.
Синтаксис
await session.expire_all()
Пример
Давайте создадим асинхронную сессию, добавим статью
и посмотрим, что произойдет после вызова expire_all:
import asyncio
from sqlalchemy import String, Integer
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String)
text: Mapped[str] = mapped_column(String)
status: Mapped[str] = mapped_column(String)
num: Mapped[int] = mapped_column(Integer)
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
async with AsyncSession(engine) as session:
article = Article(
title='article',
text='text',
status='draft',
num=1
)
session.add(article)
await session.commit()
print(article.title)
session.expire_all()
print(article.title)
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
"article"
"article"
Пример
Давайте убедимся, что после expire_all объект
перезагружается из базы данных и видит изменения,
выполненные напрямую через соединение:
Результат выполнения кода:
Как видно из примера, до вызова expire_all
объект хранил старое значение, а после вызова
при обращении к атрибуту status был выполнен
новый SQL-запрос, который вернул актуальные данные.
Смотрите также
-
класс
AsyncSession,
который представляет асинхронную сессию -
метод
expire,
который помечает устаревшим один объект -
метод
refresh,
который немедленно перезагружает объект -
метод
commit,
который фиксирует изменения в базе