Метод dispose
Метод dispose класса AsyncEngine закрывает пул соединений
и освобождает все ресурсы, связанные с движком. После вызова метода
движок становится непригодным для дальнейшего использования - попытка
открыть новое соединение приведет к ошибке. Метод является
асинхронным, поэтому его следует вызывать через await.
Метод не принимает обязательных параметров и возвращает None.
Его удобно применять при завершении работы приложения или при
необходимости принудительно разорвать все активные соединения
с базой данных.
Синтаксис
await engine.dispose()
Пример
Давайте создадим асинхронный движок для базы SQLite
в памяти, выполним простой запрос и закроем пул соединений:
import asyncio
from sqlalchemy.ext.asyncio import create_async_engine
from sqlalchemy import text
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with engine.connect() as conn:
res = await conn.execute(text('SELECT 1'))
print(res.scalar())
await engine.dispose()
print('Engine disposed')
asyncio.run(main())
Результат выполнения кода:
1
Engine disposed
Пример
Давайте убедимся, что после вызова dispose использовать
движок нельзя - попробуем открыть соединение повторно:
import asyncio
from sqlalchemy.ext.asyncio import create_async_engine
from sqlalchemy import text
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
await engine.dispose()
try:
async with engine.connect() as conn:
await conn.execute(text('SELECT 1'))
except Exception as e:
print(type(e).__name__)
asyncio.run(main())
Результат выполнения кода:
"InvalidRequestError"
Пример
Давайте создадим таблицу articles, добавим строку,
а затем корректно закроем движок методом dispose:
import asyncio
from sqlalchemy.ext.asyncio import create_async_engine
from sqlalchemy import text
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with engine.begin() as conn:
await conn.execute(text(
'CREATE TABLE articles ('
'id INTEGER PRIMARY KEY, '
'title VARCHAR, '
'text VARCHAR, '
'status VARCHAR, '
'num INTEGER)'
))
await conn.execute(text(
"INSERT INTO articles (title, text, status, num) "
"VALUES ('article', 'text', 'draft', 1)"
))
async with engine.connect() as conn:
res = await conn.execute(text('SELECT title FROM articles'))
print(res.scalar())
await engine.dispose()
print('Pool closed')
asyncio.run(main())
Результат выполнения кода:
article
Pool closed
Смотрите также
-
класс
AsyncEngine,
который представляет асинхронный движок базы данных -
метод
connect,
который открывает соединение с базой -
метод
begin,
который открывает транзакцию -
атрибут
pool,
который хранит пул соединений движка