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

Трекер привычек. Fastapi + pyTelegramBotAPI. Миграции. Alembic. Часть 2

Продолжаем разговор. Первую часть своего повествования я переписал, сделал рефакторинг и теперь код выглядит так: Это всё что относится к фронтенду, бэк остался без изменений. Как мне кажется, самым правильным будет регистрацию произвести при запуске бота, то есть при выполнении команды /start. Будет запрошен пользователь по его user_id, который уникален для каждого пользователя telegram. При нажатии пользователем кнопки "старт" происходит запрос к базе данных есть или нет там пользователь с таким id. Если пользователь есть - выводим его "привычки", если нет - предлагаем пройти процедуру регистрации. Что-то типа этого: И в зависимости от полученных результатов выдаём ответ в чате: Наверное, самое время внедрять базу данных, писать модель пользователя и миграции с помощью alembic. Так как, последнее время, в требованиях к проекту, встречаю Postgres, то её то родимую и буду пользовать. Здесь так же в требованиях - использовать Postgres. Я не стал усложнять код дополнительными конструк
Оглавление
Фото для карточки. Фото автора.
Фото для карточки. Фото автора.

Продолжаем разговор. Первую часть своего повествования я переписал, сделал рефакторинг и теперь код выглядит так:

Это всё что относится к фронтенду, бэк остался без изменений.

Регистрация пользователя

Как мне кажется, самым правильным будет регистрацию произвести при запуске бота, то есть при выполнении команды /start. Будет запрошен пользователь по его user_id, который уникален для каждого пользователя telegram.

При нажатии пользователем кнопки "старт" происходит запрос к базе данных есть или нет там пользователь с таким id. Если пользователь есть - выводим его "привычки", если нет - предлагаем пройти процедуру регистрации. Что-то типа этого:

фронт
фронт
бэк
бэк

И в зависимости от полученных результатов выдаём ответ в чате:

-5

Наверное, самое время внедрять базу данных, писать модель пользователя и миграции с помощью alembic.

База данных Postgres. Models

Так как, последнее время, в требованиях к проекту, встречаю Postgres, то её то родимую и буду пользовать. Здесь так же в требованиях - использовать Postgres.

Я не стал усложнять код дополнительными конструкциями, типа преобразования имени класса в имя таблицы. Таблиц то будет во всем проекте - раз, два, три... не больше!

В первую очередь потребуется базовая модель:

-6

Затем накидал первоначальную модель пользователя:

-7

Теперь нужно сделать подключение к базе данных. Использовать я буду уже установленный в операционной системе (у меня Manjaro Linux) пакет postgresql. Создам там новую базу данных, пусть будет у нее имя - habit_db (оригинальненько, не правда ли?!).

-8

Теперь нужно описать конфиг, который будет создавать все настройки для подключения к базе данных. Особо заморачиваться не буду - возьму из прошлого, базового FastAPI приложения (файлы config.py и db_helper.py).

Ну вот, вроде бы всё необходимое для миграций сделано. Самое время установить alembic: poertry add alembic

-10

Вспомним как инициализировать и настраивать, это я записывал в статье:

Настройка alembic

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

alembic init -t async alembic

-11

Появилась директория alembic и файл alembic.ini, начнем с alembic.ini. Нужно раскомментировать строчки:

file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s

и

hooks = black
black.type = console_scripts
black.entrypoint = black
black.options = -l 79 REVISION_SCRIPT_FILENAME

Хотя, по большому счету, это всего лишь украшательство (подключение логгирования и форматирования с помощью black).

Самая важная настройка alembic в файле alebic/env.py

Импортируем базовую модель и настройки подключения к базе данных:

from src.backend.models.base import Base
from src.backend.core.config import settings

Подключаем эти импорты:

target_metadata = Base.metadata
config.set_main_option("sqlalchemy.url", str(settings.db.url))

В прошлом проекте (twitter_clone) требовался строгий линтер flake8 на базе wemake, которому очень не нравился мой код в файлах __init__.py, поэтому он был от туда исключен. В этом же проекте я акривно использую этот файл, поэтому и модели все будут записаны в __init__.py это упростит использование alembic. Не придется дополнительно где-то импортировать модели чтобы alembic их увидел.

-12

Пробую сделать автогенерацию revision:

-13

Вот что появилось в директории alembic/versions/

-14

Ну вроде бы всё норм, можно и сделать upgrade:

-15

Посмотрим что там в базе данных появилось...

-16

Да, всё нормально. Но есть проблема. У меня в файле .env записаны параметры подключения к базе данных и параметры подключения к телеграм-боту. Вместе они конфликтуют. На это ругается pydantic при создании конфигурационного файла подключения к базе данных. Пришлось удалить запись подключения к телеграм-боту и только после этого миграции успешно накатились.

Я эту коллизию, чуть позже, исправлю в комментариях к данной статье.

Слава Богу, проект медленно но верно движется вперёд!