Метод invalidate
Метод invalidate класса Session
помечает текущее соединение с базой данных
как недействительное и сбрасывает его.
Метод принимает необязательный параметр
connection_is_valid, который указывает,
следует ли считать соединение пригодным
для дальнейшего использования. Если параметр
равен False (значение по умолчанию),
соединение будет закрыто и исключено из пула.
Если параметр равен True, SQLAlchemy
попытается использовать соединение повторно,
предварительно проверив его валидность.
Метод не принимает других аргументов и
возвращает None.
Синтаксис
Session.invalidate(connection_is_valid=False)
Пример
Давайте создадим сессию, выполним запрос
и сбросим соединение методом invalidate:
from sqlalchemy import create_engine, text
from sqlalchemy.orm import Session
engine = create_engine('sqlite:///:memory:')
with Session(engine) as session:
res = session.execute(text('SELECT 1'))
print(res.scalar())
session.invalidate()
print(session.is_active)
Результат выполнения кода:
"1"
"False"
Пример
Давайте проверим, что после вызова
invalidate с параметром
connection_is_valid=True сессия
остается активной:
from sqlalchemy import create_engine, text
from sqlalchemy.orm import Session
engine = create_engine('sqlite:///:memory:')
with Session(engine) as session:
session.execute(text('SELECT 1'))
session.invalidate(connection_is_valid=True)
print(session.is_active)
res = session.execute(text('SELECT 2'))
print(res.scalar())
Результат выполнения кода:
"True"
"2"
Пример
Давайте посмотрим, как метод invalidate
влияет на объекты, загруженные в сессию.
После сброса соединения объекты становятся
недействительными и будут перезагружены
при следующем обращении:
from sqlalchemy import create_engine, text
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]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(Article(title='article'))
session.commit()
article = session.get(Article, 1)
print(article.title)
session.invalidate()
print(article.title)
Результат выполнения кода:
"article"
"article"