|
Non saprei stimare quanti statement SQL ho scritto nella mia vita di programmatore. Mischiare codice SQL all'interno del proprio linguaggio di programmazione, qualunque esso sia, lo rende meno leggibile, più brutto, e - specialmente se le query sono complesse - particolarmente inelegante. Anche programmando secondo il paradigma MVC (caldamente raccomandato in alcuni casi, come le applicazioni web) si finisce semplicemente con lo spostare il codice SQL nel modello, mentre forse la scelta migliore sarebbe quella di liberarsene del tutto. Il problema è che è necessario interrogare il database, quindi non è possibile rimuovere il codice SQL; si può, tuttavia, inserire qualcos'altro al suo posto. Vediamo cosa, ovviamente dal punto di vista del programmatore Perl.
Esistono moduli che permettono l'astrazione dal linguaggio SQL generando codice a partire da una struttura dati. Ciò consente di utilizzare strutture arbitrariamente complesse per generare query arbitrariamente complesse senza scrivere una riga di codice database-related all'interno del proprio programma Perl. È opportuno notare che ciò è diverso da quello che fanno gli ORM (Object Relational Mappers): questi ultimi astraggono il database in oggetti, mentre qui si parla di astrazione di query SQL. Spesso, comunque, un buon ORM (come DBIx::Class) fornisce anche l'astrazione delle query, di solito utilizzando uno dei moduli disponibili su CPAN. Probabilmente vorrete utilizzare un ORM, ma questa è un'altra storia.
In questo breve articolo verrà trattato SQL::Abstract, che tra l'altro è quello utilizzato da DBIx::Class). È piuttosto semplice imparare come scrivere semplici query con questo modulo, e con un po' di ragionamento anche quelle complesse possono essere espresse sotto forma di strutture dati Perl. Se per esempio si ha:
my $query = "SELECT users.name, users.phone, users.email
FROM users
WHERE users.id = 1 OR users.id = 2
ORDER BY id
";
my $sth = $dbh->prepare($query) or die $dbh->errstr;
$sth->execute() or die $dbh->errstr;
utilizzando SQL::Abstract si può scrivere:
my $sql = SQL::Abstract->new();
my ($query, @bind) = $sql->select(
'users',
[ 'name', 'phone', 'email' ],
{ id => [ 1, 2 ] },
[ 'id' ],
);
my $sth = $dbh->prepare($query) or die $dbh->errstr;
$sth->execute(@bind) or die $dbh->errstr;
Si potrebbe obiettare che il codice è più lungo, ed in effetti un po' lo è (anche se la formattazione contribuisce a ciò). Esso è tuttavia molto più chiaro: non c'è codice extra-Perl accanto ai nomi ed ai valori dei campi, e si può capire alla prima occhiata cosa fa la query. Il metodo select accetta 4 parametri: il nome della tabella su cui si intende lavorare; i nomi dei campi da ritornare; la where clause; l'opzionale ordinamento dei risultati. Come valore di ritorno si ottiene una stringa contentente la query, e l'array dei bound values da utilizzarsi al momento di chiamare execute.
Continua a leggere "SQL::Abstract per non scrivere più (troppo) SQL"
Commenti (0)
| TrackBack (0)
|