Метод expunge_all
Метод expunge_all класса Session удаляет
все объекты из сессии. После вызова этого метода
все объекты становятся отсоединенными от сессии
и больше не отслеживаются ею. Метод не принимает
параметров и не возвращает значений.
В отличие от метода expunge, который удаляет
один конкретный объект, метод expunge_all
очищает сессию полностью. При этом сами объекты
не удаляются из базы данных, а лишь перестают
быть связанными с сессией.
Синтаксис
Session.expunge_all()
Пример
Давайте создадим сессию, добавим в нее несколько
объектов и вызовем метод expunge_all:
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))
text: Mapped[str] = mapped_column(String(1000))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article1 = Article(title='article 1', text='text 1')
article2 = Article(title='article 2', text='text 2')
session.add_all([article1, article2])
session.commit()
print(f"Before expunge_all: {len(session.identity_map)}")
session.expunge_all()
print(f"After expunge_all: {len(session.identity_map)}")
Результат выполнения кода:
"Before expunge_all: 2"
"After expunge_all: 0"
Пример
Давайте проверим, что после вызова метода
expunge_all объекты становятся
отсоединенными от сессии:
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))
text: Mapped[str] = mapped_column(String(1000))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article', text='text')
session.add(article)
session.commit()
print(f"In session: {article in session}")
session.expunge_all()
print(f"In session: {article in session}")
Результат выполнения кода:
"In session: True"
"In session: False"
Пример
Давайте убедимся, что после вызова метода
expunge_all объекты остаются в базе
данных и доступны для повторной загрузки:
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(100))
text: Mapped[str] = mapped_column(String(1000))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article', text='text')
session.add(article)
session.commit()
session.expunge_all()
res = session.scalars(select(Article)).all()
print(f"Articles in DB: {len(res)}")
print(f"Title: {res[0].title}")
Результат выполнения кода:
"Articles in DB: 1"
"Title: article"
Смотрите также
-
класс
Session,
который представляет сессию для работы с базой данных -
метод
expunge,
который удаляет один конкретный объект из сессии -
метод
expire_all,
который сбрасывает состояние всех объектов в сессии -
метод
close,
который закрывает сессию и освобождает ресурсы