No więc, napisałeś swoją pierwszą procedurę albo funkcję, odpaliłeś ją, ale coś poszło nie tak. Jasne, możesz dorzucić masę RAISE NOTICE, żeby ogarnąć, gdzie dokładnie "statek wszedł na rafy". Ale! Po co się męczyć, skoro mamy pgAdmin z wbudowanym debugowaniem?
pgAdmin daje ci możliwość krokowego wykonywania kodu, ustawiania breakpoints (punktów zatrzymania), podglądania wartości zmiennych i szukania przyczyn błędów. To dosłownie twój "detektywistyczny zestaw" do śledztwa: "Czemu mój zapytanie nie działa?".
Po co debugować przez pgAdmin?
Czasem wewnętrzne bugi procedur są tak głęboko schowane, że próby ogarnięcia ich tylko przez logi albo tekst w terminalu to czysta męczarnia. Właśnie wtedy ratuje debugowanie krok po kroku, kiedy widzisz wszystko, co się dzieje na każdym etapie działania funkcji. Wyobraź sobie, że to jak układanie mega trudnych puzzli, ale z podpowiedziami.
Z debugowaniem w pgAdmin możesz:
- Ustawić breakpoints — miejsca, gdzie wykonanie kodu się zatrzyma, żebyś mógł przeanalizować jego aktualny stan.
- Przejść krok po kroku przez SQL-kod — dosłownie linia po linii zobaczyć, co się wykonuje.
- Podglądać wartości zmiennych na żywo — upewnić się, że dane są przekazywane i obrabiane poprawnie.
- Namierzyć miejsce, gdzie wyskoczył błąd i ogarnąć jego przyczynę.
Jak zacząć: przygotowanie do debugowania w pgAdmin
Zanim zaczniesz debugować, sprawdźmy, czy wszystko jest dobrze ustawione.
Włączenie rozszerzenia plpgsql
Upewnij się, że w twojej bazie danych jest włączony język programowania PL/pgSQL:
CREATE EXTENSION IF NOT EXISTS plpgsql;
Ten język zazwyczaj jest domyślnie włączony w PostgreSQL, ale lepiej sprawdzić.
Upewnij się, że masz zainstalowany pgAdmin w wersji 4 lub wyższej (on obsługuje debugowanie). Jeśli jeszcze go nie masz, możesz pobrać pgAdmin z oficjalnej strony.
Instalacja rozszerzenia pldbgapi
Żeby włączyć debugowanie PL/pgSQL w pgAdmin, musisz aktywować rozszerzenie pldbgapi:
CREATE EXTENSION IF NOT EXISTS pldbgapi;
To rozszerzenie jest specjalnie stworzone do współpracy z debuggerem.
Bardzo ważne!!! Upewnij się, że masz prawa administratora na serwerze PostgreSQL, żeby wykonać to zapytanie.
Podstawy debugowania: ustawianie breakpoints
Breakpoints — to specjalne miejsca w kodzie, gdzie wykonanie procedury albo funkcji się zatrzymuje, żebyś mógł zajrzeć do środka procesu. To jak krótki przystanek na długiej trasie: zatrzymujesz się, rozglądasz, sprawdzasz mapę i jedziesz dalej.
Jak ustawić breakpoint w pgAdmin?
- Otwórz pgAdmin i połącz się z twoją bazą danych.
- Znajdź swoją funkcję albo procedurę w drzewku obiektów: Functions → <twoja schemat> → <twoja funkcja>.
- Kliknij prawym przyciskiem na funkcji i wybierz Debugging → Debug. To odpali debugger.
- W oknie z kodem funkcji znajdź linię, od której chcesz zacząć debugowanie, i kliknij w pole po lewej stronie linii. Zobaczysz czerwone kółko — to właśnie breakpoint.
Tak to wygląda:
CREATE OR REPLACE FUNCTION example_function(id INTEGER)
RETURNS VOID AS $$
BEGIN
RAISE NOTICE 'Wy wybraliście id: %', id;
-- Tutaj można ustawić breakpoint
PERFORM some_operation(id);
END;
$$ LANGUAGE plpgsql;
Jak już ustawisz breakpoint, możesz odpalić wykonanie swojej funkcji i zatrzyma się dokładnie w tym miejscu. Teraz możesz sprawdzić wartości zmiennych, wyniki wcześniejszych operacji i oczywiście kontynuować wykonanie kodu.
Podgląd zmiennych w pgAdmin
Wiedzieć, że twój kod się zatrzymał, to spoko. Ale jeszcze lepiej ogarnąć, jakie dane są w tym momencie w pamięci. Na przykład:
- Jakie wartości mają parametry wejściowe.
- Jak się zmieniły zmienne po wykonaniu konkretnego bloku.
- Co zwróciło zapytanie do bazy.
Jak podejrzeć wartości zmiennych?
Kiedy wykonanie funkcji zatrzyma się na breakpoincie:
- Przejdź na zakładkę Variables na dole okna debugowania.
- Tu zobaczysz listę wszystkich zmiennych i ich aktualne wartości.
Załóżmy, że mamy funkcję:
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;
Jeśli ustawisz breakpoint na linii z discounted_price, debugger pokaże, że zmienne price i discount już mają wartości, ale discounted_price jest jeszcze puste.
Tak wygląda lista zmiennych po zatrzymaniu:
| Zmienna | Wartość |
|---|---|
price |
100.00 |
discount |
15.00 |
discounted_price |
NULL |
Po wykonaniu tej linii discounted_price zmieni się na 85.00.
Krokowe wykonywanie kodu
W oknie debuggera możesz sterować wykonaniem swojej funkcji za pomocą przycisków:
- Step Over — wykonuje aktualny operator i przechodzi do następnego.
- Step Into — pozwala "wejść" do wywoływanej funkcji albo procedury.
- Continue — kontynuuje wykonanie funkcji do następnego breakpointa albo końca.
Praktyka: debugowanie bardziej złożonych funkcji
Spróbujmy napisać i zdebugować bardziej złożoną funkcję.
Przykład: obsługa zamówień
CREATE OR REPLACE FUNCTION process_order(order_id INTEGER)
RETURNS TEXT AS $$
DECLARE
order_status TEXT;
total_amount NUMERIC;
BEGIN
-- Ustawiamy status zamówienia
SELECT status INTO order_status
FROM orders
WHERE id = order_id;
IF order_status = 'Pending' THEN
-- Liczymy sumę zamówienia
SELECT SUM(price * quantity) INTO total_amount
FROM order_items
WHERE order_id = order_id;
-- Aktualizujemy status zamówienia
UPDATE orders
SET status = 'Processed', processed_date = NOW()
WHERE id = order_id;
RETURN 'Zamówienie obsłużone. Suma: ' || total_amount;
ELSE
RETURN 'Zamówienie już obsłużone albo nie istnieje.';
END IF;
END;
$$ LANGUAGE plpgsql;
Możliwe breakpoints:
- Na linii
SELECT status INTO order_status. - Na linii
SELECT SUM(price * quantity) INTO total_amount.
Podczas debugowania możesz:
- Upewnić się, że
order_statusfaktycznie ma wartość'Pending'. - Sprawdzić, czy
total_amountjest poprawnie liczona.
Częste błędy i jak sobie z nimi radzić
Podczas debugowania przez pgAdmin możesz natknąć się na takie sytuacje:
- Nie widzisz swojej funkcji na liście. Upewnij się, że funkcja faktycznie jest utworzona w twojej bazie i że jesteś połączony z właściwą bazą.
Breakpoints nie działają. Sprawdź, czy rozszerzenie
pldbgapijest włączone i czy masz odpowiednie prawa.Błąd połączenia debuggera. Upewnij się, że serwer PostgreSQL jest skonfigurowany do pracy z debugowaniem (parametr
shared_preload_librarieszawierapldbgapi).
Korzystanie z pgAdmin do debugowania PL/pgSQL sprawia, że debugowanie jest mega proste i intuicyjne. Ustaw breakpointa, zobacz co się dzieje w twoich zmiennych i popraw wszystkie niedociągnięcia — to już połowa drogi do twojej idealnej aplikacji!
GO TO FULL VERSION