Метод begin класса AsyncConnection
Метод begin класса AsyncConnection
открывает новую транзакцию в асинхронном
соединении с базой данных. Метод не принимает
обязательных параметров и возвращает объект
AsyncTransaction, который используется
для управления транзакцией. Транзакция
автоматически закрывается при выходе
из асинхронного контекстного менеджера
async with.
Синтаксис
AsyncConnection.begin()
Пример
Давайте откроем транзакцию и выполним несколько запросов на вставку данных:
import asyncio
from sqlalchemy import text
from sqlalchemy.ext.asyncio import create_async_engine
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 TEXT)')
)
await conn.execute(
text("INSERT INTO articles (title) VALUES ('article 1')")
)
await conn.execute(
text("INSERT INTO articles (title) VALUES ('article 2')")
)
res = await conn.execute(text('SELECT title FROM articles'))
print(res.fetchall())
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
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with engine.connect() as conn:
await conn.execute(
text('CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)')
)
transaction = await conn.begin()
await conn.execute(
text("INSERT INTO articles (title) VALUES ('article 1')")
)
await transaction.commit()
res = await conn.execute(text('SELECT title FROM articles'))
print(res.fetchall())
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
[('article 1',)]
Пример
Давайте откатим транзакцию методом
rollback при возникновении ошибки:
import asyncio
from sqlalchemy import text
from sqlalchemy.ext.asyncio import create_async_engine
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with engine.connect() as conn:
await conn.execute(
text('CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)')
)
transaction = await conn.begin()
try:
await conn.execute(
text("INSERT INTO articles (title) VALUES ('article 1')")
)
await transaction.rollback()
except Exception as error:
await transaction.rollback()
print('rolled back:', error)
res = await conn.execute(text('SELECT title FROM articles'))
print(res.fetchall())
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
[]
Смотрите также
-
класс
AsyncConnection,
который представляет асинхронное соединение с базой -
метод
commit,
который фиксирует текущую транзакцию -
метод
rollback,
который откатывает текущую транзакцию -
метод
execute,
который выполняет SQL-запрос в соединении