Ответ вслух Middle SQLAlchemy 2.0 спрашивают часто обновлено

Как вы управляете Session в веб-приложении

Вопрос

Как вы организуете работу с Session SQLAlchemy в FastAPI-сервисе?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «Engine и asyncsessionmaker создаю один раз при старте, в lifespan, а при остановке вызываю engine.dispose(). Сессию на запрос отдаю зависимостью с yield: async with SessionLocal() as session: yield session, тогда она гарантированно закроется и вернёт соединение в пул.

Что должно прозвучать в ответе

  • Engine и sessionmaker один раз на приложение, пул соединений

  • Сессия на запрос через зависимость с yield

  • Явные транзакции, commit в сервисе, rollback при ошибке

  • Загрузка связей заранее, raiseload против незаметного N+1

  • expire_on_commit=False для async и ответов после коммита

  • Короткие транзакции без внешних вызовов внутри

Что могут спросить следом

  • Где делать commit: в репозитории, в сервисе или в зависимости?
  • Как тестировать код с Session?

Разбор

Образцовый ответ: «Engine и async_sessionmaker создаю один раз при старте, в lifespan, а при остановке вызываю engine.dispose(). Сессию на запрос отдаю зависимостью с yield: async with SessionLocal() as session: yield session, тогда она гарантированно закроется и вернёт соединение в пул. Границы транзакции держу в сервисном слое: сервис выполняет операцию целиком и коммитит, при исключении откат. Репозитории не коммитят сами, иначе две операции не объединить в одну транзакцию. В async не полагаюсь на ленивую загрузку: всё, что понадобится сериализатору, гружу через selectinload или joinedload, а в тестах включаю raiseload, чтобы незамеченный N+1 падал сразу. Ставлю expire_on_commit=False, чтобы после коммита отдать объект в ответ без нового запроса. И слежу, чтобы в транзакции не было вызовов внешних API: иначе соединение держится секундами, и пул заканчивается под нагрузкой».

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме