Метод expire класса AsyncSession
Метод expire класса AsyncSession помечает указанные объекты как устаревшие.
После этого при следующем обращении к атрибутам объекта SQLAlchemy
автоматически выполнит запрос к базе данных и загрузит актуальные значения.
Первым параметром метод принимает экземпляр модели, подлежащий
сбросу, а необязательным параметром attribute_names можно
ограничить сброс только определенными полями.
Синтаксис
await session.expire(instance, [attribute_names])
Пример
Давайте создадим объект, а затем пометим его устаревшим
с помощью метода expire:
import asyncio
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
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')
session.add(article)
await session.commit()
print(article.title)
session.expire(article)
article.title = 'new article'
await session.commit()
print(article.title)
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
"article"
"new article"
Пример
Давайте сбросим только одно поле объекта, передав его имя
в параметре attribute_names:
import asyncio
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
text: Mapped[str]
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='sqlite:///:memory:')
session.add(article)
await session.commit()
session.expire(article, ['title'])
print(article.title)
print(article.text)
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
"article"
"sqlite:///:memory:"
Смотрите также
-
класс
AsyncSession,
который представляет асинхронную сессию -
метод
refresh,
который обновляет состояние объекта из базы -
метод
expire_all,
который сбрасывает все объекты сессии -
метод
commit,
который фиксирует изменения в базе данных