Функция object_session
Функция object_session возвращает объект
сессии, с которой связан переданный объект
модели. Первым параметром функция принимает
экземпляр модели. Если объект не привязан
ни к какой сессии, функция возвращает None.
Это удобно для получения сессии внутри
методов модели без передачи ее явно.
Синтаксис
object_session(instance)
Пример
Давайте создадим модель и получим сессию
для объекта через функцию object_session:
from sqlalchemy import create_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
from sqlalchemy.orm import object_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)
with Session(engine) as session:
article = Article(title='article')
session.add(article)
session.flush()
res = object_session(article)
print(res is session)
Результат выполнения кода:
True
Пример
Давайте проверим, что для объекта вне сессии
функция возвращает None:
from sqlalchemy import create_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from sqlalchemy.orm import object_session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
article = Article(title='article')
res = object_session(article)
print(res)
Результат выполнения кода:
None
Пример
Давайте используем функцию внутри метода модели для доступа к сессии:
from sqlalchemy import create_engine, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
from sqlalchemy.orm import object_session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
def siblings(self):
session = object_session(self)
stmt = select(Article).where(Article.id != self.id)
return session.scalars(stmt).all()
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article 1'),
Article(title='article 2'),
Article(title='article 3'),
])
session.flush()
article = session.scalars(select(Article)).first()
res = [a.title for a in article.siblings()]
print(res)
Результат выполнения кода:
['article 2', 'article 3']
Смотрите также
-
класс
DeclarativeBase,
который является базой для декларативных моделей -
функцию
make_transient,
которая отвязывает объект от сессии -
функцию
close_all_sessions,
которая закрывает все открытые сессии -
функцию
declarative_base,
которая создает базовый класс для моделей