Sobes.tech
Back to questions
Middle
2

Что такое AsyncSession в SQLAlchemy и какие правила работы с ней в контексте FastAPI микросервиса?

Companies where asked
aic

Answer from AI

sobes.tech AI

AsyncSession в SQLAlchemy — это асинхронный вариант сессии для работы с базой данных, который позволяет выполнять операции ввода-вывода (например, запросы к БД) без блокировки основного потока. В контексте FastAPI микросервиса это особенно важно для повышения производительности и масштабируемости.

Основные правила работы с AsyncSession в FastAPI:

  • Создание сессии: Обычно AsyncSession создаётся через async_sessionmaker, который настраивается на асинхронный движок (например, с использованием asyncpg для PostgreSQL).

  • Жизненный цикл сессии: В FastAPI рекомендуется использовать зависимость (dependency) с yield, чтобы создавать сессию на время обработки запроса и корректно её закрывать после.

  • Асинхронные операции: Все операции с базой (запросы, коммиты) должны выполняться с использованием await.

  • Транзакции: Можно использовать контекстный менеджер async with session.begin(): для автоматического управления транзакциями.

Пример зависимости для AsyncSession в FastAPI:

from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
from fastapi import Depends

DATABASE_URL = "postgresql+asyncpg://user:password@localhost/dbname"
engine = create_async_engine(DATABASE_URL, echo=True)
async_session = async_sessionmaker(engine, expire_on_commit=False)

async def get_async_session() -> AsyncSession:
    async with async_session() as session:
        yield session

В обработчиках FastAPI можно принимать сессию так:

from fastapi import APIRouter, Depends

router = APIRouter()

@router.get("/items/")
async def read_items(session: AsyncSession = Depends(get_async_session)):
    result = await session.execute("SELECT * FROM items")
    items = result.scalars().all()
    return items

Таким образом, AsyncSession обеспечивает неблокирующую работу с БД, что важно для асинхронных веб-приложений на FastAPI.