Атрибут deleted класса Session
Атрибут deleted класса Session возвращает
коллекцию объектов, которые были помечены на удаление
в текущей сессии, но изменения по которым ещё не
зафиксированы в базе данных. Атрибут доступен только
для чтения и обновляется автоматически при вызове
методов delete, flush, commit и
rollback. Атрибут не принимает параметров.
Синтаксис
Session.deleted
Пример
Давайте создадим сессию, добавим объект и посмотрим,
как атрибут deleted меняется после вызова метода
delete:
from sqlalchemy import create_engine, Integer, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(Integer, primary_key=True)
title: Mapped[str] = mapped_column(String)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article')
session.add(article)
session.commit()
print(session.deleted)
session.delete(article)
print(session.deleted)
Результат выполнения кода:
IdentitySet([])
IdentitySet([Article(id=1, title='article')])
Пример
Давайте убедимся, что после вызова метода flush
список удалённых объектов очищается, так как изменения
уже отправлены в базу данных:
from sqlalchemy import create_engine, Integer, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(Integer, primary_key=True)
title: Mapped[str] = mapped_column(String)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article')
session.add(article)
session.commit()
session.delete(article)
print(session.deleted)
session.flush()
print(session.deleted)
Результат выполнения кода:
IdentitySet([Article(id=1, title='article')])
IdentitySet([])
Пример
Давайте посмотрим, как откат транзакции методом
rollback возвращает объект в сессию и
убирает его из коллекции deleted:
from sqlalchemy import create_engine, Integer, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(Integer, primary_key=True)
title: Mapped[str] = mapped_column(String)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article')
session.add(article)
session.commit()
session.delete(article)
print(session.deleted)
session.rollback()
print(session.deleted)
Результат выполнения кода:
IdentitySet([Article(id=1, title='article')])
IdentitySet([])
Пример
Давайте проверим, что при удалении нескольких объектов
все они попадают в коллекцию deleted:
from sqlalchemy import create_engine, Integer, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(Integer, primary_key=True)
title: Mapped[str] = mapped_column(String)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article1 = Article(title='article')
article2 = Article(title='user')
session.add_all([article1, article2])
session.commit()
session.delete(article1)
session.delete(article2)
print(len(session.deleted))
Результат выполнения кода:
2