Allora, hai scritto la tua prima procedura o funzione, l’hai lanciata, ma qualcosa è andato storto. Certo, puoi aggiungere un sacco di RAISE NOTICE per capire dove esattamente “la nave si è incagliata”. Ma! Perché soffrire, se c’è pgAdmin con il debugger integrato?
pgAdmin ti permette di eseguire il codice passo-passo, impostare breakpoints, vedere i valori delle variabili e cercare le cause degli errori. È letteralmente il tuo “kit da detective” per indagare il mistero: “Perché la mia query non funziona?”.
Perché fare debug tramite pgAdmin?
A volte i bug interni delle procedure sono nascosti così in profondità che provare a capirli solo con i log o il testo nel terminale diventa una tortura. Ed è qui che il debug passo-passo ti salva, perché vedi tutto quello che succede a ogni step dell’esecuzione della funzione. Immagina di dover risolvere un puzzle super difficile, ma con gli indizi.
Con il debug in pgAdmin puoi:
- Impostare breakpoints — sono punti dove l’esecuzione del codice si ferma, così puoi analizzare lo stato attuale.
- Andare passo-passo nel codice SQL — letteralmente vedere, riga per riga, quale istruzione viene eseguita.
- Vedere i valori delle variabili in tempo reale — assicurarti che i dati vengano passati e gestiti correttamente.
- Trovare il punto dove si è verificato l’errore e capirne la causa.
Come iniziare: preparazione al debug in pgAdmin
Prima di partire con il debug, assicuriamoci che tutto sia configurato come si deve.
Abilitare l’estensione plpgsql
Assicurati che nella tua base dati sia abilitato il linguaggio PL/pgSQL:
CREATE EXTENSION IF NOT EXISTS plpgsql;
Di solito questo linguaggio è attivo di default in PostgreSQL, ma meglio controllare.
Assicurati di avere installato pgAdmin versione 4 o superiore (supporta il debug). Se non ce l’hai ancora, puoi scaricare pgAdmin dal sito ufficiale.
Installare l’estensione pldbgapi
Per abilitare il debug di PL/pgSQL in pgAdmin, devi attivare l’estensione pldbgapi:
CREATE EXTENSION IF NOT EXISTS pldbgapi;
Questa estensione è fatta apposta per interagire col debugger.
Molto importante!!! Assicurati di avere i permessi da admin sul server PostgreSQL per eseguire questa query.
Basi del debug: impostare i breakpoints
I breakpoints sono punti speciali nel codice dove l’esecuzione della procedura o funzione si ferma, così puoi dare un’occhiata dentro al processo. È come una pausa durante un lungo viaggio: ti fermi, dai un’occhiata alla mappa, poi riparti.
Come impostare un breakpoint in pgAdmin?
- Apri pgAdmin e connettiti al tuo database.
- Trova la tua funzione o procedura nell’albero degli oggetti: Functions → <la tua schema> → <la tua funzione>.
- Fai clic destro sulla funzione e scegli Debugging → Debug. Questo avvia il debugger.
- Nella finestra che si apre col codice della funzione, trova la riga da cui vuoi iniziare il debug e clicca a sinistra della riga. Vedrai un cerchio rosso — quello è il breakpoint.
Ecco come appare:
CREATE OR REPLACE FUNCTION example_function(id INTEGER)
RETURNS VOID AS $$
BEGIN
RAISE NOTICE 'Hai scelto id: %', id;
-- Qui puoi mettere un breakpoint
PERFORM some_operation(id);
END;
$$ LANGUAGE plpgsql;
Dopo che hai messo il breakpoint, puoi lanciare la funzione e l’esecuzione si fermerà proprio lì. Ora puoi controllare i valori delle variabili, i risultati delle istruzioni precedenti e, ovviamente, continuare l’esecuzione del codice.
Visualizzare le variabili in pgAdmin
Sapere che il tuo codice si è fermato è già qualcosa. Ma è molto più utile capire quali dati ci sono in memoria in quel momento. Per esempio:
- Quali valori hanno i parametri in ingresso.
- Come sono cambiate le variabili dopo un certo blocco.
- Cosa ha restituito la query al database.
Come vedere i valori delle variabili?
Quando l’esecuzione della funzione si ferma su un breakpoint:
- Vai sulla tab Variables in basso nella finestra del debugger.
- Qui vedrai la lista di tutte le variabili e i loro valori attuali.
Supponiamo di avere questa funzione:
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;
Se metti un breakpoint sulla riga con discounted_price, il debugger mostrerà che le variabili price e discount hanno già un valore, ma discounted_price è ancora vuota.
Ecco come appare la lista delle variabili dopo lo stop:
| Variabile | Valore |
|---|---|
price |
100.00 |
discount |
15.00 |
discounted_price |
NULL |
Dopo che esegui la riga corrente, discounted_price diventa 85.00.
Esecuzione passo-passo del codice
Nella finestra del debugger puoi controllare l’esecuzione della funzione con i pulsanti:
- Step Over — esegue l’istruzione corrente e passa alla successiva.
- Step Into — ti permette di “entrare” nella funzione o procedura chiamata.
- Continue — continua l’esecuzione fino al prossimo breakpoint o fino alla fine.
Applicazione pratica: debug di funzioni complesse
Dai, proviamo a scrivere e debuggare una funzione un po’ più tosta.
Esempio: gestione degli ordini
CREATE OR REPLACE FUNCTION process_order(order_id INTEGER)
RETURNS TEXT AS $$
DECLARE
order_status TEXT;
total_amount NUMERIC;
BEGIN
-- Impostiamo lo stato dell’ordine
SELECT status INTO order_status
FROM orders
WHERE id = order_id;
IF order_status = 'Pending' THEN
-- Calcoliamo il totale dell’ordine
SELECT SUM(price * quantity) INTO total_amount
FROM order_items
WHERE order_id = order_id;
-- Aggiorniamo lo stato dell’ordine
UPDATE orders
SET status = 'Processed', processed_date = NOW()
WHERE id = order_id;
RETURN 'Ordine processato. Totale: ' || total_amount;
ELSE
RETURN 'Ordine già processato o non esiste.';
END IF;
END;
$$ LANGUAGE plpgsql;
Punti dove puoi mettere i breakpoints:
- Sulla riga
SELECT status INTO order_status. - Sulla riga
SELECT SUM(price * quantity) INTO total_amount.
Durante il debug puoi:
- Assicurarti che
order_statusabbia davvero il valore'Pending'. - Controllare che
total_amountvenga calcolato giusto.
Errori comuni e come risolverli
Durante il debug con pgAdmin potresti trovarti in queste situazioni:
- Non vedi la tua funzione nella lista. Assicurati che la funzione sia davvero creata nel database e che tu sia connesso al database giusto.
I breakpoints non funzionano. Controlla che l’estensione
pldbgapisia attiva e che tu abbia i permessi necessari.Errore di connessione al debugger. Assicurati che il server PostgreSQL sia configurato per il debug (il parametro
shared_preload_librariesdeve includerepldbgapi).
Usare pgAdmin per il debug di PL/pgSQL rende il processo super semplice e intuitivo. Metti un breakpoint, guarda cosa “respirano” le tue variabili e sistema tutti i problemi — sei già a metà strada verso la tua app perfetta!
GO TO FULL VERSION