Репозиторий с иллюстрации одного из решений задания для Backend-разработчика Школы IT.
Информация об оформлении коммитов
- feat: (новая функционал кода, БЕЗ учёта функционала для сборок)
- devops: (функционал для сборки, - добавление, удаление и исправление)
- fix: (исправление ошибок функционального кода)
- docs: (изменения в документации)
- style: (форматирование, отсутствующие точки с запятой и т.п., без изменения производственного кода)
- refactor: (рефакторинг производственного кода, например, переименование переменной)
- test: (добавление недостающих тестов, рефакторинг тестов; без изменения производственного кода)
- chore: (обновление рутинных задач и т. д.; без изменения производственного кода).
Текст задания
Реализовать RESTFull API сервис, с 3-мя эндпоинтами (Стек: Python, FastApi, PostgreSQL, pydantic). Требуется:
- Получение всех строк из бд.
- Отдает данные из БД, с возможностью фильтрации по полу, с заданным LIMIT.
- Принимает JSON{id, name, gender}, парсит данные и сохраняет в бд. Необходимо валидировать данные (по типу).
Cтолбцы в базе данных: id, name(str), gender(str). БД заполнить случайными данными.
Комментарии к реализации
- Решил использовать ORM
sqlalchemy
(предварительно уточнив у инициатора задания возможность её использования), — удобно работать с простыми запросами и легко настроить подключения к БД. Можно было бы напрямую работать с psycopg2.pool, но посчитал это более сложным решением. - Решил не использовать инструменты для работы с миграциями (
alembic
), — для задачи нет необходимости хранить изменения по структуре БД. - Структуру проекта выбрал следующую:
fastapi-project
├── docker # директория с докерфайлами для docker-compose.yml
├── scripts # директория со скриптами для тестов или sql скриптами
├── src # директория для кода
│ ├── user # какой-либо функциональный блок (далее ФБ)
│ │ ├── models.py # модели для базы данных
│ │ ├── routers.py # обработчики (эндпоинты) путей для ФБ
│ │ ├── schemas.py # схемы (модели) pydantic для ФБ
│ │ ├── services.py # бизнес логика ФБ
│ │ ├── models.py # модели ФБ для базы данных
│ │ └── types.py # типы используемые в ФБ
│ ├── config.py # глобальный конфиг
│ ├── database.py # вещи, связанные с подключением к БД
│ └── main.py # основной файл запуска приложения
├── .env # файл кредов (с секретами)
├── .env.example # файл с примером кредов
├── .gitignore
└── docker-compose.yml
Посчитал довольно гибкой для малых и средних проектов.
- Создание таблиц в БД обеспечивается за счёт вызова функции
init_models
при запуске приложения. - Для взаимодействия с БД решил использовать синхронную сессию, — требований по асинхронной работе не предъявлялось (действовал по принципу KISS).
- Заполнение БД решил сделать с помощью отдельного скрипта через пакет
Faker
(скрипт самый простой и без дополнительных проверок). Скрипт можно запускать после того как структура таблиц была инициализирована (в коде делается автоматически при первом запуске) - Полноценную обработку ошибок не стал ставить, — это сделано для простоты (по заданию не требовалось).
- Полноценную сборку докера также нет необходимости приводить, — реализовал только поднятие БД postgresql.
- Клонировать репозиторий проекта и зайти в директорию проекта.
- Создать для проекта виртуальное окружение (через pip или poetry).
- Переименовать файл
.env.example
в файл.env
и настроить его под БД. Если не хочется вручную создавать соединение для БД, можно воспользоватьсяdocker-compose.yml
. Для запуска в фоновом режиме необходимо ввести команду:docker-compose up --build --remove-orphans -d
- Для запуска приложения можно запустить файл
main.py
или воспользоваться uvicorn:uvicorn src.main:app --reload
- Для заполнения БД можно (ПОСЛЕ ПЕРВОГО ЗАПУСКА ПРИЛОЖЕНИЯ) воспользоваться
скриптом
scripts/fill_db.py
.
P.S. Simplicity is the ultimate sophistication.