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

Метод 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 обрабатывает исключение и автоматически откатывает транзакцию:

<+python+> 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) try: async with async_session.begin() as session: session.add(Article(title='article')) raise ValueError('rollback') except ValueError: pass async with async_session.begin() as session: res = await session.get(Article, 1) print(res) await engine.dispose() asyncio.run(main()) <-python+>

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

"None"

Пример

Давайте обновим запись внутри транзакции и убедимся, что изменения зафиксированы:

<+python+> import asyncio from sqlalchemy import select 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: session.add(Article(title='article')) async with async_session.begin() as session: res = await session.execute(select(Article).where(Article.id == 1)) article = res.scalar_one() article.title = 'user' async with async_session.begin() as session: res = await session.execute(select(Article.title)) print(res.scalar_one()) await engine.dispose() asyncio.run(main()) <-python+>

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

"user"

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

  • класс async_sessionmaker,
    который создает фабрику асинхронных сессий
  • метод begin,
    который открывает транзакцию сессии
  • метод configure,
    который перенастраивает параметры фабрики сессий
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить