Найти в Дзене
Computer Pro

Twitter-clone на FastAPI. Подключение к базе данных PostgreSQL. Часть 2.

Итак, фронтенд запущен и работает: Дабы ничего не поломать в том что сделал ранее - переключаюсь на новую ветку git - develop и там уже буду создавать модель пользователя и прочие атрибуты базы данных. Здесь будет описано минимально-рабочее подключение к базе данных через docker-compose, перенос роутов в отдельную директорию и файл. Пробное создание таблиц. Первое что я решил сделать - убрать роуты в отдельную директорию api, и тут же у меня всё сломалось... Моя любимая ошибка по поводу невозможности найти какой либо модуль для его импорта! Как оказалось, дело было в отсутствии файла __init__.py в директории src (причем файл пустой). Роут, который заставляет функционировать фронтенд: И пока у меня нет базы данных - возвращаются заготовленные изначально данные, после подключения к postgres этот код будет изменен. Заодно сделать схему валидации pydantic, чтобы в документации было все красиво: Посмотрим что там на данный момент в Swagger: Ну и соответственно main.py, который так же подвер
Оглавление
Красивая фоточка для карточки. Фото автора. Архангельск весна 2024
Красивая фоточка для карточки. Фото автора. Архангельск весна 2024

Итак, фронтенд запущен и работает:

Дабы ничего не поломать в том что сделал ранее - переключаюсь на новую ветку git - develop и там уже буду создавать модель пользователя и прочие атрибуты базы данных.

Здесь будет описано минимально-рабочее подключение к базе данных через docker-compose, перенос роутов в отдельную директорию и файл. Пробное создание таблиц.

Роуты

Первое что я решил сделать - убрать роуты в отдельную директорию api, и тут же у меня всё сломалось...

-2

Моя любимая ошибка по поводу невозможности найти какой либо модуль для его импорта! Как оказалось, дело было в отсутствии файла __init__.py в директории src (причем файл пустой).

Роут, который заставляет функционировать фронтенд:

Как можно видеть префикс api вынесен отдельно от основного пути (пока пусть будет так)
Как можно видеть префикс api вынесен отдельно от основного пути (пока пусть будет так)

И пока у меня нет базы данных - возвращаются заготовленные изначально данные, после подключения к postgres этот код будет изменен.

Заодно сделать схему валидации pydantic, чтобы в документации было все красиво:

-4

Посмотрим что там на данный момент в Swagger:

-5

Ну и соответственно main.py, который так же подвергся изменению:

-6

Проверяем чтобы главная страница всё так же загружалась:

-7

Настройки подключения к БД

Необходимо вынести настройки базы данных и подключения к ней в отдельные файлы config.py и .env

-8
-9

APP_CONFIG__DB__URL, эти настройки я буду использовать для создания базы данных, при поднятии докер-контейнеров при помощи docker compose.

Обновленный файл docker-compose.yaml

-10

Пробую запустить... иии:

-11

Все запустилось...

Пробное создание таблиц

Попробую через DBEaver подключиться к базе данных и вручную выполнить какой либо запрос, например создать таблицу, для проверки работоспособности моего контейнера с БД:

-12
-13

Всё работает, коннект с базой осуществляется, теперь нужно тоже самое повторить через приложение. Сделать такой же запрос, но уже в приложении fastapi.

Для этого я создам в src/core новую директорию model, и в ней уже создам файл db_helper.py в котором будет осуществляться подключение к БД:

И вот казалось бы всё должно заработать, но не заработало...

-14

Опять моя любимая ошибка, которая уже кричит - у тебя нет .env файла!!! Верней скромно напоминает, а я уже и не знаю чего и делать, почему его нет!!! ведь когда собирается образ приложения делается COPY всей директории src где и находится этот .env

Как оказалось - нужно было указать путь к этому файлу в docker-compose.yaml

-15

И только после этого ошибка ушла... Теперь db_helper импортируется, можно продолжать и создать модели: базовую и User

Но сначала, я попробую создать пробную таблицу без использования моделей:

-16

Супер! Всё сработало!

-17

Итак, базовая модель:

-18

Модель пользователей, со связью many-to-many (У каждого пользователя может быть множество подписчиков, как и у каждого подписчика может быть тоже много подписчиков(юзеров)):

-19

Вызываю создание таблиц из главного (main.py) файла и наслаждаюсь созданными таблицами в базе данных:

-20
-21

Как происходило в консоли создание таблиц:

-22

Итак, минимально рабочие роуты и таблицы созданы. На этом можно завершить данную статью, дабы не растягивать на длинную "простынь".

Следующий шаг - это сделать чтобы мой роут, который передает во фронтенд вот этот код:

-23

Брал эту запись из базы данных, а не так как это сделано сейчас...

На том и закончу...