Атрибут new класса Session
Атрибут new класса Session возвращает
множество IdentitySet, содержащее объекты,
которые были добавлены в сессию через методы
add или add_all, но еще не
синхронизированы с базой данных. Объект попадает
в это множество в момент добавления и покидает
его после вызова flush или commit.
Атрибут доступен только для чтения и не принимает
параметров.
Синтаксис
session.new
Пример
Давайте создадим сессию и добавим в нее новый
объект, после чего проверим содержимое атрибута
new:
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(500))
status: Mapped[str] = mapped_column(String(50))
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(
title='article',
text='some text',
status='draft',
num=1,
)
session.add(article)
print(session.new)
Результат выполнения кода:
"IdentitySet([<Article at 0x...>])"
Пример
Давайте убедимся, что после вызова flush
объект исчезает из множества new:
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(500))
status: Mapped[str] = mapped_column(String(50))
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(
title='article',
text='some text',
status='draft',
num=1,
)
session.add(article)
print('before flush:', len(session.new))
session.flush()
print('after flush:', len(session.new))
Результат выполнения кода:
"before flush: 1"
"after flush: 0"
Пример
Давайте добавим сразу несколько объектов через
add_all и посмотрим, как изменится размер
множества new:
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(500))
status: Mapped[str] = mapped_column(String(50))
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
articles = [
Article(title='article 1', text='text 1', status='draft', num=1),
Article(title='article 2', text='text 2', status='draft', num=2),
Article(title='article 3', text='text 3', status='draft', num=3),
]
session.add_all(articles)
print('new count:', len(session.new))
Результат выполнения кода:
"new count: 3"