Метод commit класса AsyncConnection
Метод commit класса AsyncConnection
фиксирует текущую транзакцию, то есть применяет
все изменения, выполненные в рамках этой транзакции,
к базе данных. Метод не принимает параметров и
возвращает объект None. Вызывать его следует
только тогда, когда асинхронное соединение уже
находится внутри активной транзакции, например
после вызова метода begin или после
выполнения первого запроса, автоматически
открывшего транзакцию.
Синтаксис
await conn.commit()
Пример
Давайте создадим асинхронный движок для базы
SQLite в памяти, откроем соединение
и зафиксируем изменения методом commit:
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)'))
await conn.execute(text("INSERT INTO articles (title) VALUES ('article')"))
await conn.commit()
res = await conn.execute(text('SELECT title FROM articles'))
print(res.fetchall())
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
[('article',)]
Пример
Давайте явно откроем транзакцию методом
begin, выполним несколько изменений
и зафиксируем их одним вызовом commit:
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)'))
async with conn.begin():
await conn.execute(text("INSERT INTO articles (title) VALUES ('article 1')"))
await conn.execute(text("INSERT INTO articles (title) VALUES ('article 2')"))
await conn.execute(text("INSERT INTO articles (title) VALUES ('article 3')"))
res = await conn.execute(text('SELECT title FROM articles'))
print(res.fetchall())
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
[('article 1',), ('article 2',), ('article 3',)]
Пример
Давайте покажем, что без вызова commit
изменения не попадут в базу данных. После
отката транзакции таблица будет пустой:
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)'))
await conn.execute(text("INSERT INTO articles (title) VALUES ('article')"))
await conn.rollback()
res = await conn.execute(text('SELECT COUNT(*) FROM articles'))
print(res.scalar())
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
0
Смотрите также
-
класс
AsyncConnection,
который представляет асинхронное соединение с базой -
метод
begin,
который открывает новую транзакцию -
метод
rollback,
который откатывает текущую транзакцию -
метод
close,
который закрывает асинхронное соединение