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

Телеграмм-бот на AIOGram. От простого, к сложному. Часть 5

На прошлой статье я попытался объяснить как работают миддлвары на aiogram. Возможно это получилось доходчиво, а возможно и нет. Я пытался это объяснить в первую очередь себе... Сегодня я попытаюсь "подружить" телеграм-бот с системой управления базами данных (СУБД) Postgresql. А так же настроить систему миграций alembic. Для этого, я добавлю в файл .env, в котором хранится BOT_TOKEN, настройки подключения к базе данных PG: Которые будут считаны в /src/config_data/config.py: Затем, как оказалось, у меня на компе не установлен postgresql. Пришлось это исправить, методом: sudo pacman -S postgresql и настроить: При создани БД и пользователя буду использовать те же данные что и в .env: Теперь дело за созданием db_helper.py в котором будет создаваться асинхронный движок и фабрика сессий: И когда мне понадобится сделать какой-либо запрос к базе данных, я буду через db_helper создавать сессию и подключаться к базе данных. Теперь надо сделать какую нибудь модель, пусть будет это модель users
Фото для катрочки. Белое море. август 2021. Фото автора.
Фото для катрочки. Белое море. август 2021. Фото автора.

На прошлой статье я попытался объяснить как работают миддлвары на aiogram. Возможно это получилось доходчиво, а возможно и нет. Я пытался это объяснить в первую очередь себе...

Сегодня я попытаюсь "подружить" телеграм-бот с системой управления базами данных (СУБД) Postgresql. А так же настроить систему миграций alembic.

Для этого, я добавлю в файл .env, в котором хранится BOT_TOKEN, настройки подключения к базе данных PG:

-2

Которые будут считаны в /src/config_data/config.py:

-3

Затем, как оказалось, у меня на компе не установлен postgresql. Пришлось это исправить, методом: sudo pacman -S postgresql и настроить:

-4

При создани БД и пользователя буду использовать те же данные что и в .env:

помимо создания пользователя и БД, надо созданному пользователю позволить полноценно владеть созданной БД. Переопределяю владельца БД.
помимо создания пользователя и БД, надо созданному пользователю позволить полноценно владеть созданной БД. Переопределяю владельца БД.

Теперь дело за созданием db_helper.py в котором будет создаваться асинхронный движок и фабрика сессий:

-6

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

Теперь надо сделать какую нибудь модель, пусть будет это модель users, куда будут сохраняться все пользователи нажавшие кнопку /start:

модель пока лишена каких либо связей с другими таблицами (потому что этих таблиц пока не будет)
модель пока лишена каких либо связей с другими таблицами (потому что этих таблиц пока не будет)

Создана одна единственная модель, теперь нужно сделать миграции, чтобы эта таблица появилась непосредственно в базе данных. Только после этого можно будет отправлять какие либо запросы к БД.

Установим alembic + black: pip install alembic black

Сделаем инициализацию алембика и подключение black:

инициализация алембик
инициализация алембик
редактируем alembic.ini
редактируем alembic.ini
редактируем alembic.ini
редактируем alembic.ini

В проекте появляется директория alembic, в которой нужно отредактировать файл env.py:

-11

Настройки сделаны, можно создавать первую миграцию:

-12

Если ни на что не ругнется, то появится первая миграция в директории alembic/versions:

-13

Если нас всё устраивает в этой миграции то можно "накатить" изменения непосредственно в базе данных:

-14

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

В прошлой статье, ссылочка вверху, я описывал работу миддлварей, и вот этот middleware мне сейчас поможет сохранить пользователя (если конечено его ещё нет в базе данных)

-15

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

-16

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

Глянем что там в БД:

да, новый пользователь в БД!
да, новый пользователь в БД!

Это пока что трудно назвать рабочим приложением, но оно движется к некому функциональному продукту.

На сегодня всё.

Хотел уже опубликовать статью, да попросил у жены телефон, дай думаю попробую с её телефона запустить бота и сохранить её данные в БД и тут меня ждало фиаско! Я не смог записать её user_id, так как числа типа int имеют предельную длину:

-18

Когда я проверял на своем телефоне - всё чудненько, ведь мой id короче максимальной длины типа integer. А у жены - idшник уже длинней, и выскочила ошибка. Что-то типа: "value out of int32 range". Я не успел заскринить её полностью. Пришлось изменять модель и делать миграцию.

-19
-20

После чего, запись пользователя создалась в БД:

-21

Ну а теперь действительно финал статьи!

Слава Богу!