Метод begin класса AsyncEngine
Метод begin класса AsyncEngine создает
асинхронный контекстный менеджер для работы с транзакцией
базы данных. Он автоматически открывает соединение,
начинает транзакцию и фиксирует изменения при успешном
выходе из блока. При возникновении исключения транзакция
откатывается. Метод не принимает обязательных параметров.
Синтаксис
async with engine.begin() as conn:
# work with connection
Пример
Давайте создадим асинхронный движок и выполним простой запрос внутри транзакции:
import asyncio
from sqlalchemy.ext.asyncio import create_async_engine
from sqlalchemy import text
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with engine.begin() as conn:
res = await conn.execute(text('SELECT 1'))
print(res.scalar())
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
"1"
Пример
Давайте создадим таблицу и вставим данные,
используя метод begin для автоматической
фиксации изменений:
import asyncio
from sqlalchemy.ext.asyncio import create_async_engine
from sqlalchemy import text
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with engine.begin() as conn:
await conn.execute(text(
'CREATE TABLE articles ('
'id INTEGER PRIMARY KEY, '
'title VARCHAR(50)'
')'
))
await conn.execute(text(
"INSERT INTO articles (title) VALUES ('article')"
))
async with engine.begin() as conn:
res = await conn.execute(text('SELECT title FROM articles'))
print(res.fetchall())
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
[('article',)]
Пример
Давайте посмотрим, как метод begin откатывает
транзакцию при возникновении исключения:
import asyncio
from sqlalchemy.ext.asyncio import create_async_engine
from sqlalchemy import text
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with engine.begin() as conn:
await conn.execute(text(
'CREATE TABLE articles ('
'id INTEGER PRIMARY KEY, '
'title VARCHAR(50)'
')'
))
try:
async with engine.begin() as conn:
await conn.execute(text(
"INSERT INTO articles (title) VALUES ('article')"
))
raise ValueError('Something went wrong')
except ValueError as e:
print(f'Error: {e}')
async with engine.begin() as conn:
res = await conn.execute(text('SELECT COUNT(*) FROM articles'))
print(res.scalar())
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
"Error: Something went wrong"
"0"
Смотрите также
-
класс
AsyncEngine,
который представляет асинхронный движок базы данных -
метод
connect,
который открывает асинхронное соединение с базой -
метод
dispose,
который закрывает пул соединений движка -
атрибут
sync_engine,
который возвращает синхронный движок