Атрибут dirty
Атрибут dirty класса Session возвращает
объект IdentitySet, содержащий все объекты,
которые были изменены в текущей сессии, но еще
не сброшены в базу данных. Атрибут доступен только
для чтения и обновляется автоматически при изменении
состояния объектов.
Синтаксис
session.dirty
Пример
Давайте создадим сессию, добавим объект и изменим
его, чтобы увидеть, как работает атрибут dirty:
from sqlalchemy import create_engine
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]
text: Mapped[str]
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.flush()
print(len(session.dirty))
article.title = 'new article'
print(len(session.dirty))
print(session.dirty)
Результат выполнения кода:
0
1
{Article(id=1)}
Пример
Давайте проверим, что после сброса изменений
атрибут dirty становится пустым:
from sqlalchemy import create_engine
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]
text: Mapped[str]
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.flush()
article.text = 'new text'
print(len(session.dirty))
session.flush()
print(len(session.dirty))
Результат выполнения кода:
1
0
Пример
Давайте посмотрим, как атрибут dirty
работает с несколькими объектами:
from sqlalchemy import create_engine
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]
text: Mapped[str]
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.flush()
article1.title = 'new article 1'
article2.text = 'new text 2'
print(len(session.dirty))
for article in session.dirty:
print(article.title)
Результат выполнения кода:
2
new article 1
article 2