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

Функция make_transient

Функция make_transient преобразует объект модели SQLAlchemy в состояние transient. Первым параметром функция принимает объект модели. После вызова объект теряет связь с сессией, его идентификатор сбрасывается, а сам объект становится полностью независимым от базы данных. Это полезно, когда нужно скопировать объект и сохранить его как новую запись, либо извлечь объект из сессии без удаления из базы.

Объект в состоянии transient не имеет идентификатора первичного ключа и не отслеживается сессией. При добавлении такого объекта в новую сессию через метод add он будет воспринят как новый и при flush получит новый первичный ключ.

Синтаксис

make_transient(instance)

Пример

Давайте создадим объект, сохраним его в базе, а затем преобразуем в transient и посмотрим на результат:

from sqlalchemy import create_engine, Integer, String from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session from sqlalchemy.orm import make_transient 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(article.id) make_transient(article) print(article.id)

Результат выполнения кода:

1 None

Пример

Давайте используем make_transient, чтобы скопировать существующий объект и сохранить его как новую запись в той же таблице:

from sqlalchemy import create_engine, Integer, String from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session from sqlalchemy.orm import make_transient 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() original_id = article.id make_transient(article) article.title = 'article copy' session.add(article) session.commit() print(original_id) print(article.id) print(article.title)

Результат выполнения кода:

1 2 "article copy"

Пример

Давайте убедимся, что после вызова make_transient объект больше не отслеживается сессией:

from sqlalchemy import create_engine, Integer, String from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session from sqlalchemy.orm import make_transient from sqlalchemy import inspect 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() state = inspect(article) print(state.persistent) print(state.transient) make_transient(article) state = inspect(article) print(state.persistent) print(state.transient)

Результат выполнения кода:

True False False True

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

  • функцию make_transient_to_detached,
    которая преобразует объект в detached-состояние
  • функцию object_session,
    которая возвращает сессию, связанную с объектом
  • функцию close_all_sessions,
    которая закрывает все открытые сессии
  • класс DeclarativeBase,
    который служит базой для декларативных моделей
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить