Метод begin класса async_sessionmaker
Метод begin класса async_sessionmaker
создает асинхронный контекстный менеджер,
который открывает новую сессию и начинает
транзакцию. При входе в блок async with
метод возвращает объект AsyncSession.
Если блок завершается без исключений, транзакция
автоматически фиксируется, а сессия закрывается.
При возникновении исключения транзакция
откатывается, а сессия также закрывается.
Метод не принимает обязательных параметров,
кроме необязательного параметра **kw,
который передается в конструктор сессии.
Синтаксис
async with async_sessionmaker_instance.begin() as session:
# работа с session
Пример
Давайте создадим асинхронный движок и
async_sessionmaker, а затем откроем
транзакцию с помощью метода begin:
import asyncio
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
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_session = async_sessionmaker(engine, expire_on_commit=False)
async with async_session.begin() as session:
article = Article(title='article')
session.add(article)
async with async_session.begin() as session:
res = await session.get(Article, 1)
print(res.title)
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
"article"
Пример
Давайте посмотрим, как метод begin
обрабатывает исключение и автоматически
откатывает транзакцию:
Результат выполнения кода:
"None"
Пример
Давайте обновим запись внутри транзакции и убедимся, что изменения зафиксированы:
Результат выполнения кода:
"user"
Смотрите также
-
класс
async_sessionmaker,
который создает фабрику асинхронных сессий -
метод
begin,
который открывает транзакцию сессии -
метод
configure,
который перенастраивает параметры фабрики сессий