Метод close
Метод close класса AsyncSession закрывает
асинхронную сессию, освобождая пул соединений и
все связанные с ней ресурсы. Метод не принимает
параметров и является асинхронным, поэтому его
нужно вызывать через await. После закрытия
сессия не может использоваться для выполнения
запросов. Метод автоматически выполняет откат
текущей транзакции, если она не была зафиксирована.
Синтаксис
await session.close()
Пример
Давайте создадим асинхронную сессию и закроем
ее методом close:
import asyncio
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
session = AsyncSession(engine)
print('session is active')
await session.close()
print('session is closed')
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
"session is active"
"session is closed"
Пример
Давайте выполним запрос в сессии, а затем закроем ее, чтобы освободить соединение:
import asyncio
from sqlalchemy import text
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
session = AsyncSession(engine)
res = await session.execute(text('SELECT 1'))
print(res.scalar())
await session.close()
print('session is closed')
await engine.dispose()
asyncio.run(main())
Итоговый SQL запрос:
SELECT 1
Результат выполнения кода:
"1"
"session is closed"
Пример
Давайте добавим объект в сессию и закроем
ее без вызова commit, чтобы изменения
не сохранились:
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
import asyncio
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from models import Base, Article
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
session = AsyncSession(engine)
article = Article(
title='article',
text='some text',
status='draft',
num=1
)
session.add(article)
await session.close()
print('session is closed')
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
"session is closed"
Так как метод commit не был вызван, объект
article не был сохранен в базе данных.
Пример
Давайте закроем сессию с помощью асинхронного
контекстного менеджера, который автоматически
вызывает метод close:
import asyncio
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with AsyncSession(engine) as session:
print('session is open')
print('session is closed')
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
"session is open"
"session is closed"
Смотрите также
-
класс
AsyncSession,
который представляет асинхронную сессию -
метод
commit,
который фиксирует текущую транзакцию -
метод
rollback,
который откатывает текущую транзакцию -
атрибут
bind,
который возвращает привязанный движок сессии