РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
128 of 711 menu

Атрибут 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"

Смотрите также

  • класс Session,
    который управляет жизненным циклом объектов
  • метод add,
    который добавляет объект в сессию
  • метод add_all,
    который добавляет сразу несколько объектов
  • атрибут dirty,
    который возвращает измененные объекты сессии
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить