Метод commit класса AsyncSession
Метод commit класса AsyncSession
фиксирует текущую транзакцию и сохраняет
все изменения, сделанные в рамках сессии,
в базе данных. Метод не принимает параметров
и является асинхронным, поэтому вызывается
через await. После успешного выполнения
транзакция завершается, а изменения становятся
постоянными.
Синтаксис
await session.commit()
Пример
Давайте создадим асинхронную сессию, добавим
новую статью и зафиксируем изменения методом
commit:
import asyncio
from sqlalchemy import Integer, String, Text
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(Integer, primary_key=True)
title: Mapped[str] = mapped_column(String(100))
text: Mapped[str] = mapped_column(Text)
status: Mapped[str] = mapped_column(String(50))
num: Mapped[int] = mapped_column(Integer)
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 with AsyncSession(engine) as session:
article = Article(
title='article',
text='some text',
status='published',
num=1
)
session.add(article)
await session.commit()
print(article.id)
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
1
Пример
Давайте обновим существующую статью и зафиксируем
изменения через commit:
import asyncio
from sqlalchemy import Integer, String, Text, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(Integer, primary_key=True)
title: Mapped[str] = mapped_column(String(100))
text: Mapped[str] = mapped_column(Text)
status: Mapped[str] = mapped_column(String(50))
num: Mapped[int] = mapped_column(Integer)
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 with AsyncSession(engine) as session:
article = Article(
title='article',
text='some text',
status='draft',
num=1
)
session.add(article)
await session.commit()
article.status = 'published'
await session.commit()
res = await session.execute(
select(Article.status)
)
print(res.scalar_one())
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
"published"
Пример
Давайте удалим статью и зафиксируем удаление
методом commit:
import asyncio
from sqlalchemy import Integer, String, Text, select, func
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(Integer, primary_key=True)
title: Mapped[str] = mapped_column(String(100))
text: Mapped[str] = mapped_column(Text)
status: Mapped[str] = mapped_column(String(50))
num: Mapped[int] = mapped_column(Integer)
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 with AsyncSession(engine) as session:
article = Article(
title='article',
text='some text',
status='draft',
num=1
)
session.add(article)
await session.commit()
await session.delete(article)
await session.commit()
res = await session.execute(
select(func.count()).select_from(Article)
)
print(res.scalar_one())
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
0
Смотрите также
-
класс
AsyncSession,
который представляет асинхронную сессию -
метод
rollback,
который откатывает текущую транзакцию -
метод
flush,
который отправляет изменения в базу без фиксации -
метод
begin,
который начинает новую транзакцию