Телеграм бот на Postgresql часть 8
Рекурсия автоматизации
Продолжаем предыдущую статью.
Примеры из предыдущих статей требовали ручной запуск каждого процесса.
Теперь попробуем завершить автоматизацию процесса некоторым циклом.
Создадим новую функцию:
CREATE OR REPLACE FUNCTION public.next_loop(
param jsonb DEFAULT ’{}’::jsonb)
RETURNS jsonb
LANGUAGE ‘plpgsql’
COST 100
VOLATILE
AS $BODY$DECLARE
u text DEFAULT random()::text;
j jsonb DEFAULT param;
BEGIN
PERFORM dblink.dblink_connect(u, 'host=/run/postgresql dbname=<dbname> user=<user> password=<password>’);
PERFORM pg_advisory_unlock(100);
PERFORM dblink.dblink_send_query(u, format('SELECT do_loop(%L)’, j));
PERFORM dblink.dblink_disconnect(u);
RETURN j;
END$BODY$;
Эта функция использует расширение dblink и его нужно установить в нашу базу.
Ещё в первой статье говорилось о процедурном языке PL/Python и ссылка на документацию. В документации было описание по его установке. Похожим образом устанавливается и расширение dblink. Однако в примере я использую отдельную схему с одноимённым названием расширения для удобства программирования.
В этой функции ещё есть параметры <dbname>, <user> и <password>. Вы их укажете самостоятельно в соответствии с настройками вашей базы данных.
Приведу пример как двумя запросами создать схему и подключить расширение:
CREATE SCHEMA IF NOT EXISTS dblink;
CREATE EXTENSION IF NOT EXISTS dblink SCHEMA dblink;
Теперь расширение и его функции будут находится в отдельной схеме.
Таким образом не перемешиваясь с нашими рабочими функциями.
Создадим ещё одну функцию:
CREATE OR REPLACE FUNCTION public.do_loop(
param jsonb DEFAULT ’{}’::jsonb)
RETURNS jsonb
LANGUAGE 'plpgsql’
COST 100
VOLATILE
AS $BODY$DECLARE
l bool DEFAULT pg_try_advisory_lock(100);
j jsonb DEFAULT param;
BEGIN
IF l THEN
PERFORM get_updates();
PERFORM do_start_message();
SELECT next_loop(j) INTO j;
END IF;
RETURN j;
END$BODY$;
На первый взгляд всё усложняется. Теперь мы уже создаём сразу больше одной функции. Но на самом деле просто разбили на две для удобства понимания.
Немного разберём эти две функции и их алгоритмы. Начнём с последней и опишем последовательность работы. Передачу параметров я поставил здесь только для примера. Параметры не используются.
В начале функции сразу используется триггер базы Postgresql. Который поможет предотвратить коллизию выполнения цикла. Внутри самой функции проверка на успешное включение триггера.
При успешном включении триггера сработают последовательно три функции.
Первые две мы рассматривали в предыдущих статьях. А последнюю создали первой в этой статье. Вот последняя вызванная функция и зацикливает процесс.
Наша первая функция из этой статьи выполняет следующие действия.
Она создаёт коннект к текущей базе. После чего снимает установленный во второй функции триггер. А дальше выполняет нашу вторую функцию асинхронно.
Параметр как я писал выше просто для примера и не несёт никакого функционала.
В завершении выполняется отсоединение от базы и завершение функции.
Вот таким образом создаётся бесконечный цикл с минимальной нагрузкой на базу.
Протестировать работу можно выполнив запрос:
SELECT public.do_loop()
Теперь ваш бот будет постоянно в цикле реагировать на каждую новую команду /start.
Также выполнение этой функции можно делать при запуске сервера. Но это отдельная тема и эту информацию можно почерпнуть из документации.
Для остановки нашего цикла просто выполните запрос:
SELECT pg_advisory_lock(100)
После выполнения этого запроса бесконечный цикл остановится.
Вот собственно основные шаги для создания Telegram бота созданного при помощи базы данных Postgresql.
В следующих статьях мы сможем рассмотреть более продвинутые алгоритмы для автоматизации бота.
Завершаю статью и напомню о рабочем сервере который использую по этому адресу.
Социальные страницы для новостей и комментариев: Facebook, Вконтакте, Telegram.
Обязательно пишите ваши комментарии и подписывайтесь на мои страницы.
Смело задавайте ваши вопросы на которые я буду отвечать в следующих статьях.
Приглашаю вас заглянуть на страничку проекта пассивного дохода участником которого я являюсь.