martedì 16 dicembre 2014

Calendario dell'Avvento ITPUG: 15 Dicembre

Io sono sempre stato dell'opinione che i commenti siano anche piu' importanti del codice. Però si sa, i programmatori sono pigri, gli admin pure e i commenti spesso si perdono.
Però si può commentare anche un database, e questo potrebbe tornare molto utile. Non parlo dei commenti negli script SQL ( -- e /* */ ), ma del comando COMMENT di PostgreSQL  che consente di attaccare una stringa di testo ad un oggetto di database (tabella, colonna, constraint, funzione, ...).
 
 Per cosa si può usare questa funzionalità? Ad esempio per creare una sorta di versioning del poveraccio: se ogni commento include un numero di versione (generato manualmente o automaticamente) si può capire a che versione un database/tabella è, e quindi si potrebbe intervenire piu' rapidamente per scoprire eventuali anomalie. Ma vediamo COMMENT in pratica:

# COMMENT ON CONSTRAINT imu IS 'no comment!';

(visto il giorno fatidico!)
Piu' seriamente:

# COMMENT ON TABLE foo IS 'Tabella foo versione [1.1]';



Ed è tutto! Solo una stringa può essere agganciata ad un oggetto, e quindi ricommentare lo stesso oggetto equivale a sovrascrivere il commento precedente, mentre impostarlo a NULL equivale a rimuoverlo. I commenti vengono salvati nella tabella pg_description.
Da qui a vedere un dump completo di una tabella il passo è breve:

# WITH rel_comments AS (
SELECT c.relname  AS tabella, CASE WHEN d.objsubid = 0 THEN
'--tabella--' ELSE '(#' || d.objsubid || ') ' || (SELECT attname FROM
pg_attribute a WHERE a.attrelid = c.oid AND a.attnum = d.objsubid )
END AS colonna, d.description AS commento
FROM pg_class c JOIN pg_description d ON d.objoid = c.oid )

SELECT * FROM rel_comments WHERE tabella = 'test';


 tabella |   colonna   |           commento
---------+-------------+------------------------------
  test    | --tabella-- | Tabella foo versione [1.1]
  test    | (#1) pk     | Prima versione della colonna

Un po' piu' complesso risulta invece aggiornare in append i commenti, a meno di non passare per gli oid. E' comunque possibile creare una funzione che accetti il nome della tabella e della colonna, estragga i dati necessari e faccia UPDATE di pg_description concatenando (o sostituendo) il commento.

Nessun commento: