FastAPI и SQLAlchemy: задачи на транзакции и ошибки API
API вернул успешный ответ, а запись в базе осталась прежней. Или клиент получил 409, но ошибочное бронирование уже сохранилось. В этой подборке разбираем такие сбои на FastAPI и SQLAlchemy: сначала предсказываем поведение короткого фрагмента, затем работаем с готовой лабораторной.
Что стоит различать
Объект в Session, строка в базе и HTTP-ответ — три разных вещи. Присваивание атрибута само по себе не завершает транзакцию. flush отправляет накопленные изменения в базу, а commit фиксирует транзакцию. После ошибки flush сессии может понадобиться явный rollback, прежде чем с ней получится работать дальше.
Начните с вопросов про первичный ключ и refresh. Затем разберите удаление без commit и повторный get в той же сессии: здесь важны момент отправки SQL и autoflush. После этого переходите к нарушению внешнего ключа и одновременной регистрации одного email.
От вопроса к работающему обработчику
В конце подборки есть три лабораторные: обновление и удаление комнаты, получение связанных бронирований и создание брони с проверкой конфликта. В каждой дан свой проект и описано, какой участок нужно дописать. Короткие вопросы проверяют понимание, лабораторные — умение сохранить нужное поведение API.
Для последовательного прохождения проекта откройте бесплатный курс FastAPI с базой данных и тестами. Валидацию входа можно отдельно отработать в подборке Pydantic, а доступ пользователя — в задачах на авторизацию.
- SQLAlchemy: id объекта до добавления в Session
Когда ORM-объект получает первичный ключ? Разберите создание Room без Session и обращения к базе. Вопрос с проверкой ответа.
FastAPI для начинающих: API с базой данных и тестами - SQLAlchemy refresh: что будет с несохранённым изменением
Разберите commit, изменение атрибута и refresh при autoflush=False. Задача на состояние объекта SQLAlchemy и данные в базе.
FastAPI для начинающих: API с базой данных и тестами - SQLAlchemy: удаление без commit и закрытие Session
Обработчик вернул 204 после delete без commit. Что увидит следующий GET? Задача на транзакции в FastAPI и SQLAlchemy.
FastAPI для начинающих: API с базой данных и тестами - SQLAlchemy: Session.get после delete без flush
Что вернёт Session.get для удаляемого объекта до flush и commit? Практический вопрос на identity map и autoflush=False.
FastAPI для начинающих: API с базой данных и тестами - SQLAlchemy IntegrityError: нужен ли rollback после flush
Разберите нарушение внешнего ключа SQLite и восстановление Session после ошибки flush. Задача с проверкой ответа.
FastAPI для начинающих: API с базой данных и тестами - SQLAlchemy: добавление столбцов в существующую таблицу
Модель ORM изменилась, таблица SQLite уже существует. Обновит ли повторное создание таблиц её структуру? Задача на схему базы данных.
FastAPI для начинающих: API с базой данных и тестами - FastAPI HTTPException после commit: откатится ли запись
Проверьте, отменяет ли ответ 409 уже выполненный commit. Задача на порядок проверки конфликта и сохранения данных в API.
FastAPI для начинающих: API с базой данных и тестами - FastAPI: два запроса на один email и UNIQUE
Оба запроса проверили отсутствие email до вставки. Выберите защиту от дублей: ограничение базы и обработка ошибки в API.
FastAPI для начинающих: API с базой данных и тестами - FastAPI и база данных: обновление и удаление записи
Обновите и удалите запись переговорной в базе данных через API, сохранив согласованность ответа FastAPI.
FastAPI для начинающих: API с базой данных и тестами - FastAPI и связь таблиц: бронирования одной комнаты
Верните бронирования только выбранной комнаты через связь таблиц в FastAPI. Задача с проверкой результата.
FastAPI для начинающих: API с базой данных и тестами - FastAPI: создание бронирования и ответ 409 при конфликте
Создайте бронь свободной комнаты и верните HTTP 409, если время пересекается с существующей бронью. Задача FastAPI.
FastAPI для начинающих: API с базой данных и тестами
