Метод flush
Метод flush класса AsyncSession
синхронизирует состояние сессии с базой данных,
выполняя все накопленные INSERT, UPDATE и DELETE
запросы в рамках текущей транзакции. При этом
транзакция не завершается, и изменения можно
откатить методом rollback. Метод является
асинхронным, поэтому вызывается через await.
Параметров метод не принимает.
Метод flush часто вызывается автоматически
перед запросами, чтобы получить сгенерированные
базой значения, например автоинкрементный id.
Синтаксис
await session.flush()
Пример
Давайте создадим объект, добавим его в сессию
и вызовем flush, чтобы получить
сгенерированный первичный ключ:
import asyncio
from sqlalchemy import String
from sqlalchemy.ext.asyncio import (
create_async_engine,
AsyncSession
)
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] = mapped_column(String(100))
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')
session.add(article)
print('before flush:', article.id)
await session.flush()
print('after flush:', article.id)
await session.commit()
asyncio.run(main())
Результат выполнения кода:
before flush: None
after flush: 1
Пример
Давайте откатим изменения после flush
с помощью rollback:
import asyncio
from sqlalchemy import String, select
from sqlalchemy.ext.asyncio import (
create_async_engine,
AsyncSession
)
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] = mapped_column(String(100))
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')
session.add(article)
await session.flush()
await session.rollback()
res = await session.execute(select(Article))
print(res.scalars().all())
asyncio.run(main())
Результат выполнения кода:
[]
Пример
Давайте выполним два flush подряд
в рамках одной транзакции:
import asyncio
from sqlalchemy import String, select
from sqlalchemy.ext.asyncio import (
create_async_engine,
AsyncSession
)
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] = mapped_column(String(100))
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:
first = Article(title='article 1')
session.add(first)
await session.flush()
second = Article(title='article 2')
session.add(second)
await session.flush()
res = await session.execute(select(Article))
print(res.scalars().all())
await session.rollback()
asyncio.run(main())
Результат выполнения кода:
[<Article id=1 title='article 1'>, <Article id=2 title='article 2'>]
Смотрите также
-
класс
AsyncSession,
который представляет асинхронную сессию -
метод
commit,
который фиксирует транзакцию -
метод
rollback,
который откатывает транзакцию -
метод
add,
который добавляет объект в сессию