Речь пойдет о том как конвертировать ответы ORM SQLAlchemy к "нормальному" человеко-читаемому формату (json).
Начало здесь:
Итак, для начала подготовим модели pydantic (Pydantic - это наиболее широко используемая библиотека проверки данных для Python):
Я как-то раньше не придавал значения какой запрос (GET или POST) использовать в первую очередь и писал GET-запрос первым, но умный человек подсказал что лучше сначала написать POST-запрос, а затем, наследуя этот запрос, добавив нужное поле, прописать GET:
Напишем простенький запрос получения работников, без использования relationship:
На что получим вот такой ответ:
Теперь сделаем тоже самое, но уже с использованием relationship:
Теперь ответ получается таким, с получением всех резюме работника:
Ну и третий вариант, с использованием группировок, напишем вот такой запрос:
После выполнения получается вот такой ответ:
На входе (result_orm) строка из столбцов, это даже не объект Worker, которая преобразуется в pydantic model, которую потом удобно будет преобразовать к json и прочим структурам данных.
Ну и в заключении, напишем скрипт, выводящий в формате json наших работников, с их резюме. Здесь уже будут использоваться файлы из предыдущих статей. Добавим в orm.py новую функцию, в класс SyncORM:
Ну и создадим сервер, с единственным эндпойнтом, который будет возвращать нам список работников и их резюме:
При отправке GET-запроса по адресу http://127.0.0.1:8000/workers получаем такой ответ:
А в логах сервера значится некий warning, пока не понимаю чего он от меня хочет, но явно так не должно быть...
Как оказалось - не нравится присутствие поля resumes_part_time, оно в принципе использовалось для демонстрации primaryjoin, можно его закомментировать. После чего warning уже не появлялся
Ну еще, пожалуй, напишу кусочек фронтенда (файл index.html), который будет получать в браузере наш список работников и красиво их демонстрировать.
Данный index.html преобразует полученный json ответ вот в такую красивую структуру:
Проблема с данным куском фронтенда (index.html) в том, что его нельзя запустить отсюда же, из Pycharm, мне для этого пришлось его (файл index.html) скопировать в только что созданное приложение на Flask, где при GET запросе возвращается (рендерится) этот index.html из директории templates. И получается у меня на компе работают сразу два сервера, один обрабатывает запросы к базе данных а второй типа клиента который эти запросы принимает. В консоли это выглядит как-то так:
В лекциях Артема Шумейко, которые я взял за основу цикла статей используется Visual Studio Code с установленным плагином Live Server, а я работаю в Pycharm, тут такого плагина не оказалось вот и пришлось "потанцевать с бубном" и запустить фласк-сервер с рендерингом этого index.html
Но таки это работает!
Мой фласк сервер выглядит так:
Создано виртуальное окружение, где только один питоновский файл run_index_html.py и директория templates с файлом index.html