Метод begin класса AsyncSession
Метод begin класса AsyncSession
открывает новую транзакцию и возвращает объект
AsyncSessionTransaction. Транзакция
используется для группировки нескольких операций
в одну атомарную единицу работы. Если транзакция
не была открыта явно, асинхронная сессия
автоматически начинает ее при первом запросе
и завершает при вызове commit или
rollback.
Метод не принимает обязательных параметров.
Возвращаемый объект транзакции поддерживает
асинхронный контекстный менеджер, что позволяет
использовать конструкцию async with.
Синтаксис
await session.begin()
Пример
Давайте создадим асинхронную сессию и откроем
транзакцию с помощью метода begin:
import asyncio
from sqlalchemy.ext.asyncio import (
create_async_engine,
AsyncSession
)
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
session = AsyncSession(engine)
transaction = await session.begin()
print(transaction)
await transaction.commit()
await session.close()
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
"<sqlalchemy.ext.asyncio.session.AsyncSessionTransaction object at 0x...>"
Пример
Давайте выполним несколько операций внутри одной
транзакции, открытой методом begin:
import asyncio
from sqlalchemy import text
from sqlalchemy.ext.asyncio import (
create_async_engine,
AsyncSession
)
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
session = AsyncSession(engine)
async with await session.begin():
await session.execute(
text('CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)')
)
await session.execute(
text("INSERT INTO articles (title) VALUES ('article 1')")
)
await session.execute(
text("INSERT INTO articles (title) VALUES ('article 2')")
)
res = await session.execute(text('SELECT title FROM articles'))
print(res.scalars().all())
await session.close()
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
['article 1', 'article 2']
Пример
Давайте откатим транзакцию, открытую методом
begin, при возникновении ошибки:
import asyncio
from sqlalchemy import text
from sqlalchemy.ext.asyncio import (
create_async_engine,
AsyncSession
)
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
session = AsyncSession(engine)
async with await session.begin():
await session.execute(
text('CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)')
)
await session.execute(
text("INSERT INTO articles (title) VALUES ('article 1')")
)
raise Exception('Something went wrong')
await session.close()
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
"Exception: Something went wrong"
Смотрите также
-
класс
AsyncSession,
который представляет асинхронную сессию -
метод
commit,
который фиксирует текущую транзакцию -
метод
rollback,
который откатывает текущую транзакцию -
метод
begin_nested,
который открывает вложенную транзакцию