Метод 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 = ?