Атрибут autoflush
Атрибут autoflush класса Session
управляет автоматическим сбросом (flush)
изменений в базу данных перед выполнением
запросов. По умолчанию атрибут имеет
значение True, что означает, что
сессия автоматически выполняет flush перед
каждым запросом. Если установить значение
False, то автоматический сброс
выполняться не будет, и изменения попадут
в базу только при явном вызове метода
flush или commit.
Атрибут можно задать при создании сессии или изменить в любой момент работы с ней. Управление автосбросом полезно, когда нужно выполнить несколько запросов без промежуточной синхронизации с базой данных.
Синтаксис
session.autoflush = True # or False
Пример
Давайте создадим сессию с атрибутом
autoflush, установленным в
True, и добавим объект:
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(100))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.autoflush = True
article = Article(title='article')
session.add(article)
res = session.query(Article).all()
print(len(res))
Результат выполнения кода:
1
Пример
Теперь установим autoflush в
False и посмотрим, как изменится
поведение:
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(100))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.autoflush = False
article = Article(title='article')
session.add(article)
res = session.query(Article).all()
print(len(res))
session.flush()
res = session.query(Article).all()
print(len(res))
Результат выполнения кода:
0
1
Пример
Атрибут autoflush можно задать
непосредственно при создании сессии через
параметр конструктора:
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(100))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine, autoflush=False) as session:
article = Article(title='article')
session.add(article)
res = session.query(Article).all()
print(len(res))
Результат выполнения кода:
0
Смотрите также
-
класс
Session,
который представляет сессию работы с базой данных -
метод
flush,
который выполняет сброс изменений в базу данных -
метод
no_autoflush,
который временно отключает автосброс -
атрибут
autocommit,
который управляет автоматической фиксацией транзакций