https://github.com/noras2001/fastapi_sqlalchemy
FastAPI app using SQLAlchemy
https://github.com/noras2001/fastapi_sqlalchemy
fastapi sqlalchemy swagger-ui
Last synced: about 2 months ago
JSON representation
FastAPI app using SQLAlchemy
- Host: GitHub
- URL: https://github.com/noras2001/fastapi_sqlalchemy
- Owner: Noras2001
- License: mit
- Created: 2025-02-14T00:27:25.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-02-14T00:34:46.000Z (over 1 year ago)
- Last Synced: 2025-02-14T01:30:57.584Z (over 1 year ago)
- Topics: fastapi, sqlalchemy, swagger-ui
- Language: Python
- Homepage:
- Size: 11.7 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# README.md
## Описание проекта
Это простое приложение на FastAPI, демонстрирующее основные возможности работы с SQLAlchemy. В рамках проекта реализованы следующие задачи:
1. **Оптимизация загрузки данных**
- Созданы модели `Author` и `Book` с отношением "один ко многим".
- Реализованы два эндпоинта для получения авторов:
- **Ленивая загрузка**: при обращении к связанным книгам выполняется дополнительный запрос (N+1).
- **Жадная загрузка**: с использованием `joinedload` все данные загружаются одним SQL-запросом.
- **Вывод**: Использование жадной загрузки помогает избежать проблемы N+1 и повышает производительность при выборке связанных объектов.
2. **Транзакции и откаты изменений**
- Создана модель `User`.
- Эндпоинт демонстрирует транзакционное добавление двух пользователей с имитацией ошибки при добавлении третьего.
- При возникновении ошибки транзакция откатывается, и база данных остается в неизменном состоянии.
- **Вывод**: Использование транзакций с автоматическим откатом обеспечивает целостность данных при возникновении ошибок.
3. **Работа с Alembic**
- В проекте даны пошаговые инструкции по инициализации Alembic, созданию миграций для таблицы `Order`, внесению изменений (добавление поля `price`, удаление поля `created_at`) и последующему откату миграций.
- **Вывод**: Alembic облегчает управление версионностью схемы базы данных и позволяет легко вносить изменения в структуру таблиц.
4. **Паттерн Repository**
- Реализован паттерн Repository для модели `Book` с методами добавления книги, получения всех книг автора по его `id` и удаления книги.
- Использование фабрики сессий для управления соединениями с базой данных.
- **Вывод**: Паттерн Repository помогает инкапсулировать логику доступа к данным, делая код более читаемым и удобным для тестирования.
5. **Логирование и объединение ORM и Core**
- Логирование SQL-запросов включено с помощью параметра `echo=True` в `create_engine`, что позволяет отслеживать сгенерированные запросы.
- Реализован сложный агрегирующий запрос с использованием SQLAlchemy Core для подсчёта количества книг у каждого автора, в то время как ORM используется для большинства CRUD операций.
- **Вывод**: Комбинированное использование SQLAlchemy ORM и Core позволяет гибко работать с базой данных, используя преимущества обоих подходов для различных типов запросов.
## Инструкции по запуску
1. **Установка зависимостей**
Установите необходимые пакеты:
```bash
pip install fastapi uvicorn sqlalchemy pydantic
```
## **Тестирование эндпоинтов:**
- Запустите приложение.
```bash
uvicorn main:app --reload
```
**Swagger UI**
- Откройте браузер и перейдите по адресу [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
Здесь вы увидите интерактивную документацию FastAPI, где можно протестировать все созданные эндпоинты.

- **Задача 1 (Ленивая и жадная загрузка):**
- GET `/authors/lazy` – получаем авторов с ленивой загрузкой.
- GET `/authors/eager` – получаем авторов с жадной загрузкой (joinedload).
- **Задача 2 (Транзакции и откат):**
- POST `/users/transaction` – попробуйте создать пользователей; транзакция будет откатана из-за искусственной ошибки.
- **Задача 3 (Alembic):**
- GET `/alembic/instructions` – ознакомьтесь с инструкциями по работе с Alembic в комментариях.
- **Задача 4 (Паттерн Repository для Book):**
- POST `/books/add` – добавление новой книги.
```
{
"title": "Избранное",
"author_id": 1
}
```
- GET `/books/by_author/{author_id}` – получение книг по id автора.
```
[
{
"id": 1,
"title": "Реквием",
"author_id": 1
},
{
"id": 2,
"title": "Поэма без героя",
"author_id": 1
},
{
"id": 3,
"title": "Избранное",
"author_id": 1
}
]
```
- DELETE `/books/{book_id}` – удаление книги по id.
- **Задача 5 (Логирование и ORM+Core):**
- GET `/authors/book_counts` – агрегирующий запрос с использованием SQLAlchemy Core, который возвращает количество книг у каждого автора.
5. **Анализ SQL-запросов:**
Так как в `create_engine` установлен параметр `echo=True`, все сгенерированные SQL-запросы будут выводиться в консоль. Это позволит вам наблюдать за работой запросов, их оптимизацией (например, при использовании `joinedload`) и объединением ORM и Core.