РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
577 of 711 menu

Метод 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,
    который добавляет объект в сессию
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить