Функция make_transient_to_detached
Функция make_transient_to_detached переводит
объект из состояния transient в состояние detached.
Transient-объект - это экземпляр модели, который
еще не был добавлен в сессию и не имеет записи
в базе данных. Функция принимает один параметр -
сам объект модели. После вызова объект получает
идентификатор и может быть присоединен к новой
сессии через метод merge.
Синтаксис
make_transient_to_detached(instance)
Пример
Давайте создадим transient-объект модели
Article и переведем его в detached-состояние:
from sqlalchemy import create_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, make_transient_to_detached, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
article = Article(id=1, title='article')
make_transient_to_detached(article)
print(article.id)
print(article.title)
Результат выполнения кода:
1
"article"
Пример
Теперь давайте свяжем detached-объект с новой
сессией через метод merge и сохраним его:
from sqlalchemy import create_engine, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, make_transient_to_detached, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
article = Article(id=1, title='article')
make_transient_to_detached(article)
with Session(engine) as session:
merged = session.merge(article)
session.commit()
print(merged.id)
print(merged.title)
Результат выполнения кода:
1
"article"
Пример
Давайте проверим, что после вызова функции объект действительно находится в detached-состоянии:
from sqlalchemy import create_engine, inspect
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, make_transient_to_detached
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
article = Article(id=1, title='article')
make_transient_to_detached(article)
state = inspect(article)
print(state.detached)
print(state.persistent)
print(state.transient)
Результат выполнения кода:
True
False
False
Смотрите также
-
функцию
make_transient,
которая переводит объект в transient-состояние -
функцию
object_session,
которая возвращает сессию для объекта -
функцию
close_all_sessions,
которая закрывает все открытые сессии -
класс
DeclarativeBase,
который является базовым классом для моделей