Итак, вы написали свою первую процедуру или функцию, запустили её, но что-то пошло не так. Вы, конечно, можете добавить кучу RAISE NOTICE, чтобы понять, где именно "корабль сел на рифы". Но! Зачем нам мучиться, если есть pgAdmin с встроенной отладкой?
pgAdmin предоставляет возможность пошагово выполнять код, устанавливать точки останова (breakpoints), просматривать значения переменных и искать причины ошибок. Это буквально ваш "детективный набор" для расследования загадки: "Почему мой запрос не работает?".
Зачем нужна отладка через pgAdmin?
Иногда внутренние баги процедур спрятаны настолько глубоко, что попытки разобраться в них только с помощью логов или текста в терминале превращаются в мучение. Именно здесь выручает отладка по шагам, когда вы видите всё, что происходит на каждом этапе выполнения функции. Представьте, что это как сложить сложнейший пазл, но с подсказками.
С помощью отладки в pgAdmin вы можете:
- Установить точки останова (breakpoints) — это места, где выполнение кода остановится, чтобы вы могли проанализировать его текущее состояние.
- Пошагово пройтись по SQL-коду — в буквальном смысле шаг за шагом посмотреть, какой оператор выполняется.
- значения переменных в реальном времени — убедиться, что данные передаются и обрабатываются корректно.
- Найти место, где возникла ошибка, и понять её причину.
Как начать: подготовка к отладке в pgAdmin
Прежде чем приступить к отладке, давайте убедимся, что всё настроено правильно.
Включение расширения plpgsql
Убедитесь, что в вашей базе данных включен язык программирования PL/pgSQL:
CREATE EXTENSION IF NOT EXISTS plpgsql;
Этот язык обычно включён по умолчанию в PostgreSQL, но лучше проверить.
Убедитесь, что установлен pgAdmin версии 4 или выше (он поддерживает отладку). Если у вас его ещё нет, вы можете скачать pgAdmin с официального сайта.
Установка расширения pldbgapi
Для того чтобы включить отладку PL/pgSQL в pgAdmin, нужно активировать расширение pldbgapi:
CREATE EXTENSION IF NOT EXISTS pldbgapi;
Это расширение специально разработано для взаимодействия с отладчиком.
Очень важно!!! Убедитесь, что у вас есть права администратора на сервере PostgreSQL, чтобы выполнить данный запрос.
Основы отладки: установка точек останова (breakpoints)
Точки останова (breakpoints) — это специальные места в коде, где выполнение процедуры или функции останавливается, чтобы дать вам возможность заглянуть внутрь процесса. Это как короткий перерыв в длинной дороге: остановились, осмотрелись, проверили карту, а затем продолжили дальше.
Как установить точку останова в pgAdmin?
- Откройте pgAdmin и подключитесь к вашей базе данных.
- Найдите вашу функцию или процедуру в дереве объектов: Functions → <ваша схема> → <ваша функция>.
- Кликните правой кнопкой мыши по функции и выберите Debugging → Debug. Это запустит отладчик.
- В открывшемся окне с кодом функции найдите строку, с которой вы хотите начать отладку, и щёлкните на полях слева от строки. Вы увидите красный кружок — это и есть точка останова.
Вот как это выглядит:
CREATE OR REPLACE FUNCTION example_function(id INTEGER)
RETURNS VOID AS $$
BEGIN
RAISE NOTICE 'Вы выбрали id: %', id;
-- Здесь можно установить точку останова
PERFORM some_operation(id);
END;
$$ LANGUAGE plpgsql;
После того как точка останова установлена, вы можете запустить выполнение вашей функции, и выполнение остановится ровно на том месте. Теперь вы можете проверить значения переменных, результаты выполнения предыдущих операторов и, конечно, продолжить выполнение кода.
Просмотр переменных в pgAdmin
Знать, что ваш код остановился, это хорошо. Но гораздо полезнее понять, какие данные в этот момент находятся в памяти. Например:
- Какие значения имеют входные параметры.
- Как изменились переменные после выполнения определённого блока.
- Что вернул запрос в базу.
Как посмотреть значения переменных?
Когда выполнение функции останавливается на точке останова:
- Перейдите на вкладку Variables в нижней части окна отладки.
- Здесь вы увидите перечень всех переменных и их текущие значения.
Допустим, у нас есть функция:
CREATE OR REPLACE FUNCTION calculate_discount(price NUMERIC, discount NUMERIC)
RETURNS NUMERIC AS $$
DECLARE
discounted_price NUMERIC;
BEGIN
discounted_price := price - (price * discount / 100);
RETURN discounted_price;
END;
$$ LANGUAGE plpgsql;
Если вы установите точку останова на строке с discounted_price, отладчик покажет, что переменные price и discount уже имеют значения, но discounted_price пока пуст.
Вот так выглядит список переменных после остановки:
| Переменная | Значение |
|---|---|
price |
100.00 |
discount |
15.00 |
discounted_price |
NULL |
После того, как вы выполните текущую строку, discounted_price изменится на 85.00.
Пошаговое выполнение кода
В окне отладчика вы можете управлять выполнением вашей функции с помощью кнопок:
- Step Over — выполняет текущий оператор и переходит к следующему.
- Step Into — позволяет "погрузиться" в вызываемую функцию или процедуру.
- Continue — продолжает выполнение функции до следующей точки останова или завершения выполнения.
Практическое применение: отладка сложных функций
Давайте попробуем написать и отладить более сложную функцию.
Пример: обработка заказов
CREATE OR REPLACE FUNCTION process_order(order_id INTEGER)
RETURNS TEXT AS $$
DECLARE
order_status TEXT;
total_amount NUMERIC;
BEGIN
-- Устанавливаем статус заказа
SELECT status INTO order_status
FROM orders
WHERE id = order_id;
IF order_status = 'Pending' THEN
-- Рассчитываем сумму заказа
SELECT SUM(price * quantity) INTO total_amount
FROM order_items
WHERE order_id = order_id;
-- Обновляем статус заказа
UPDATE orders
SET status = 'Processed', processed_date = NOW()
WHERE id = order_id;
RETURN 'Заказ обработан. Сумма: ' || total_amount;
ELSE
RETURN 'Заказ уже обработан или не существует.';
END IF;
END;
$$ LANGUAGE plpgsql;
Возможные точки останова:
- На строке
SELECT status INTO order_status. - На строке
SELECT SUM(price * quantity) INTO total_amount.
В процессе отладки можно:
- Убедиться, что
order_statusдействительно имеет значение'Pending'. - Проверить, корректно ли рассчитывается
total_amount.
Частые ошибки и пути их решения
Во время отладки через pgAdmin вы можете столкнуться с такими ситуациями:
- Вы не видите вашу функцию в списке. Убедитесь, что функция действительно создана в вашей базе данных и что вы подключены к правильной базе.
Точки останова не работают. Проверьте, включено ли расширение
pldbgapiи есть ли у вас необходимые права.Ошибка подключения отладчика. Убедитесь, что сервер PostgreSQL настроен для работы с отладкой (параметры
shared_preload_librariesвключаютpldbgapi).
Использование pgAdmin для отладки PL/pgSQL делает процесс отладки невероятно простым и интуитивным. Установите точку останова, посмотрите, чем "дышат" ваши переменные, и исправьте все недочёты — это уже полпути к вашему идеальному приложению!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ