Как вы управляете Session в веб-приложении
Вопрос
Как вы организуете работу с Session SQLAlchemy в FastAPI-сервисе?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
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 ошибок.