Метод invalidate класса Connection
Метод invalidate класса Connection
помечает текущее соединение как недействительное.
При этом само соединение немедленно закрывается,
а связанный с ним ресурс возвращается в пул
с признаком непригодности. Параметров метод не принимает.
Такой подход полезен, когда соединение повреждено
или находится в неизвестном состоянии, и его
дальнейшее использование небезопасно.
В отличие от метода close, который возвращает
соединение в пул для повторного использования,
метод invalidate гарантирует, что данное
соединение больше не будет выдано другим потребителям.
После вызова метода атрибут invalidated
принимает значение True, а атрибут
closed также становится True.
Синтаксис
Connection.invalidate()
Пример
Давайте откроем соединение и аннулируем его, проверив состояние атрибутов до и после вызова:
from sqlalchemy import create_engine, text
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
conn.execute(text('SELECT 1'))
print('before invalidate:', conn.invalidated, conn.closed)
conn.invalidate()
print('after invalidate:', conn.invalidated, conn.closed)
Результат выполнения кода:
"before invalidate: False False"
"after invalidate: True True"
Пример
Давайте попробуем выполнить запрос после аннулирования соединения и посмотрим, какое исключение будет возбуждено:
from sqlalchemy import create_engine, text
engine = create_engine('sqlite:///:memory:')
conn = engine.connect()
conn.invalidate()
try:
conn.execute(text('SELECT 1'))
except Exception as exc:
print(type(exc).__name__)
print(str(exc))
finally:
conn.close()
Результат выполнения кода:
"ResourceClosedError"
"This connection is closed"
Пример
Давайте создадим таблицу, наполним ее данными, а затем проверим, что после аннулирования соединения движок выдает новое рабочее соединение:
from sqlalchemy import create_engine, text
engine = create_engine('sqlite:///:memory:')
with engine.begin() as conn:
conn.execute(text(
'CREATE TABLE articles ('
'id INTEGER PRIMARY KEY, '
'title VARCHAR(100)'
')'
))
conn.execute(text(
"INSERT INTO articles (id, title) VALUES (1, 'article')"
))
conn = engine.connect()
conn.invalidate()
with engine.connect() as new_conn:
res = new_conn.execute(text('SELECT title FROM articles'))
print(res.fetchall())
Результат выполнения кода:
[('article',)]
Смотрите также
-
класс
Connection,
который представляет соединение с базой данных -
метод
close,
который возвращает соединение в пул -
атрибут
invalidated,
который показывает признак недействительности соединения -
атрибут
closed,
который показывает, закрыто ли соединение