Найти тему
Computer Pro

Конвертация SQLAlchemy в Pydantic и FastAPI #9

Речь пойдет о том как конвертировать ответы ORM SQLAlchemy к "нормальному" человеко-читаемому формату (json).

Начало здесь:

Итак, для начала подготовим модели pydantic (Pydantic - это наиболее широко используемая библиотека проверки данных для Python):

-2
последние две модели - это relationship (связь между работниками и их резюме)
последние две модели - это relationship (связь между работниками и их резюме)

Я как-то раньше не придавал значения какой запрос (GET или POST) использовать в первую очередь и писал GET-запрос первым, но умный человек подсказал что лучше сначала написать POST-запрос, а затем, наследуя этот запрос, добавив нужное поле, прописать GET:

-4

Напишем простенький запрос получения работников, без использования relationship:

-5

На что получим вот такой ответ:

-6

Теперь сделаем тоже самое, но уже с использованием relationship:

-7

Теперь ответ получается таким, с получением всех резюме работника:

-8

Ну и третий вариант, с использованием группировок, напишем вот такой запрос:

нужно прописать еще один класс преобразователя
нужно прописать еще один класс преобразователя
-10

После выполнения получается вот такой ответ:

-11

На входе (result_orm) строка из столбцов, это даже не объект Worker, которая преобразуется в pydantic model, которую потом удобно будет преобразовать к json и прочим структурам данных.

Ну и в заключении, напишем скрипт, выводящий в формате json наших работников, с их резюме. Здесь уже будут использоваться файлы из предыдущих статей. Добавим в orm.py новую функцию, в класс SyncORM:

-12

Ну и создадим сервер, с единственным эндпойнтом, который будет возвращать нам список работников и их резюме:

-13

При отправке GET-запроса по адресу http://127.0.0.1:8000/workers получаем такой ответ:

-14

А в логах сервера значится некий warning, пока не понимаю чего он от меня хочет, но явно так не должно быть...

-15

Как оказалось - не нравится присутствие поля resumes_part_time, оно в принципе использовалось для демонстрации primaryjoin, можно его закомментировать. После чего warning уже не появлялся

-16

Ну еще, пожалуй, напишу кусочек фронтенда (файл index.html), который будет получать в браузере наш список работников и красиво их демонстрировать.

-17

Данный index.html преобразует полученный json ответ вот в такую красивую структуру:

-18

Проблема с данным куском фронтенда (index.html) в том, что его нельзя запустить отсюда же, из Pycharm, мне для этого пришлось его (файл index.html) скопировать в только что созданное приложение на Flask, где при GET запросе возвращается (рендерится) этот index.html из директории templates. И получается у меня на компе работают сразу два сервера, один обрабатывает запросы к базе данных а второй типа клиента который эти запросы принимает. В консоли это выглядит как-то так:

первый сервер работает на базе FastApi
первый сервер работает на базе FastApi
-20

В лекциях Артема Шумейко, которые я взял за основу цикла статей используется Visual Studio Code с установленным плагином Live Server, а я работаю в Pycharm, тут такого плагина не оказалось вот и пришлось "потанцевать с бубном" и запустить фласк-сервер с рендерингом этого index.html

Но таки это работает!

Мой фласк сервер выглядит так:

-21

Создано виртуальное окружение, где только один питоновский файл run_index_html.py и директория templates с файлом index.html

-22

Оба сервера работают на одном и том же ip-адресе, но на разных портах, но задачу выполняют. Как-то так. Еще немного и я закончу эту тему.

Продолжение следует...