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

Метод flush класса Session

Метод flush класса Session отправляет все накопленные изменения (новые объекты, изменения и удаления) в базу данных, но не завершает транзакцию. Это означает, что SQL-запросы выполняются на стороне базы, однако изменения остаются внутри текущей транзакции и могут быть отменены вызовом rollback. Метод не принимает обязательных параметров.

Обычно flush вызывается автоматически перед выполнением запросов, если включен режим autoflush, но иногда его вызывают вручную - например, чтобы получить сгенерированный первичный ключ у нового объекта или чтобы увидеть SQL-запросы до момента коммита.

Синтаксис

Session.flush()

Пример

Давайте создадим сессию, добавим новый объект и вызовем flush, чтобы отправить его в базу без коммита:

from sqlalchemy import create_engine, String from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(50)) text: Mapped[str] = mapped_column(String(200)) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: article = Article(title='article 1', text='text 1') session.add(article) session.flush() print(article.id)

Результат выполнения кода:

1

Пример

После вызова flush изменения видны внутри той же транзакции, но их можно откатить через rollback:

from sqlalchemy import create_engine, String, select from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(50)) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: article = Article(title='article 1') session.add(article) session.flush() session.rollback() res = session.scalars(select(Article)).all() print(res)

Результат выполнения кода:

[]

Пример

Давайте посмотрим, какие SQL-запросы отправляет flush при вставке, изменении и удалении объектов:

from sqlalchemy import create_engine, String, select from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(50)) engine = create_engine('sqlite:///:memory:', echo=True) Base.metadata.create_all(engine) with Session(engine) as session: article = Article(title='article 1') session.add(article) session.flush() article.title = 'article 2' session.flush() session.delete(article) session.flush()

Итоговые SQL запросы:

INSERT INTO articles (title) VALUES (?) UPDATE articles SET title = ? WHERE articles.id = ? DELETE FROM articles WHERE articles.id = ?

Смотрите также

  • класс Session,
    который управляет жизненным циклом объектов
  • метод commit,
    который фиксирует транзакцию в базе данных
  • метод rollback,
    который откатывает текущую транзакцию
  • атрибут autoflush,
    который управляет автоматическим сбросом изменений
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить