Метод rollback
Метод rollback класса AsyncSession
выполняет откат текущей транзакции. Все изменения,
сделанные в рамках транзакции, аннулируются, а
сессия возвращается в состояние, в котором она
находилась до начала транзакции. Метод является
асинхронным, поэтому вызывается через await.
После отката объекты, находившиеся в сессии,
устаревают и будут загружены заново при следующем
обращении.
Синтаксис
await session.rollback()
Пример
Давайте создадим асинхронную сессию, добавим новую статью и выполним откат транзакции:
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]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
Теперь выполним откат после добавления статьи:
import asyncio
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker
from models import Base, Article
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 = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
async with async_session() as session:
article = Article(title='article', text='text', status='draft', num=1)
session.add(article)
await session.rollback()
print('Rollback done')
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
"Rollback done"
Пример
Давайте убедимся, что после отката статья не сохранилась в базе данных:
import asyncio
from sqlalchemy import select
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker
from models import Base, Article
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 = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
async with async_session() as session:
article = Article(title='article', text='text', status='draft', num=1)
session.add(article)
await session.rollback()
res = await session.execute(select(Article))
print(res.scalars().all())
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
[]
Пример
Давайте рассмотрим откат после изменения существующей статьи:
import asyncio
from sqlalchemy import select
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker
from models import Base, Article
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 = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
async with async_session() as session:
article = Article(title='article', text='text', status='draft', num=1)
session.add(article)
await session.commit()
article.title = 'updated'
await session.rollback()
res = await session.execute(select(Article))
print(res.scalars().all()[0].title)
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
"article"
Смотрите также
-
класс
AsyncSession,
который представляет асинхронную сессию -
метод
commit,
который фиксирует текущую транзакцию -
метод
flush,
который отправляет изменения в базу без фиксации -
метод
close,
который закрывает асинхронную сессию