-+  Associazione
-+  Documenti
-+  Eventi
-+  Community
-+  Blog
-+  Link

Ottobre 2013

Dom Lun Mar Mer Gio Ven Sab
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

Cerca






 

« Link! (8/8/2006) | Home | Basta con programmi in stile Perl 3 »

Un DBI più dolce con DBIx::Simple
09.08.06

Questo articolo fa in parte seguito a quello su SQL::Abstract che ho scritto poco tempo fa. Questa volta vorrei mostrare le caratteristiche di un piccolo modulo che lavora bene in simbiosi con quello sopra menzionato, ma che può anche essere utilizzato in maniera produttiva senza di esso: DBIx::Simple. Questo package fornice un'interfaccia più carina a DBI, e permette di utilizzare SQL::Abstract per costruire le query (ma non obbliga al suo uso).

DBI funziona perfettamente, ma a volte diventa noioso scrive il codice che lo utilizza: la maggior parte delle volte è necessario districarsi tra prepare_cached, execute e fetchall_arrayref (o qualcuno degli altri metodi dal nome lungo, a cui spesso bisogna anche passare dei parametri necessari). DBIx::Simple rende tutto questo... più semplice. Ad esempio, se si configura la necessità di ottenere alcune righe in un hashref si può semplicemente scrivere:

use DBIx::Simple;

my $db = DBIx::Simple->new(
    'dbi:mysql:database=mio;host=miohost', 'miouser', 'miapass'
);

my $res = $db->query(
    'select id, username, indirizzo from utenti where ruolo = ?',
    'cliente'
);

my $rows = $res->hashes;

Questo modo di operare non è molto dissimile da quello di DBI, ma risulta in codice più pulito. Per inizializzare l'oggetto DBIx::Simple si può passare una DSN al costruttore (come in questo caso), oppure un oggetto DBI se già se ne dispone - cosa peraltro piuttosto comune in una situazione in cui si sta migrando un'applicazione a DBIx::Simple, e dunque vi sono parti di codice che ancora utilizzano DBI.
$db->query è un metodo unificato che permette di eseguire qualsiasi tipo di query, restituendo un oggetto che ne è il risultato, e che è più o meno equivalente allo statement handler ($sth di solito) di DBI. Tuttavia nel caso di DBIx::Simple il risultato è più facile da manipolare, e fornisce alcuni metodi extra. Ecco qualche esempio di utilizzo:

my $row = $res->hash;        # reference all'hash di una singola riga
my $row = $res->array;       # reference all'array di una singola riga
my $rows = $res->hashes;     # reference all'array di tutte le righe
                             # (che sono hash)
my $rows = $res->arrays;     # reference all'array di tutte le righe
                             # (che sono array)

Qualunque di questi metodi può anche essere invocato in contesto di lista, cosicché restituisca un hash o un array al posto della reference ad esso. Ad esempio:

my %row = $res->hash;        # hash (contesto di lista)

Supponiamo ora di aver bisogno di ottenere tutte le righe (come nel nostro esempio) come hash, ma che tali righe siano contenute in un hash le cui chiavi siano il contenuto di una delle colonne. È sufficiente scrivere come di seguito:

my $rows = $res->map_hashes('username');
print join '-', $rows->{'username'};

Benché sia senz'altro possibile utilizzare la funzione map per ottenere gli stessi risultati, la presenza di un metodo pronto all'uso aiuta a tenere il proprio codice chiaro. Ci sono altri metodi per mappature simili a queste, si consulti la documentazione del modulo per maggiori informazioni.

Come ho scritto prima, DBIx::Simple si integra bene con SQL::Abstract. La query del nostro esempio potrebbe dunque diventare:

my $res = $db->select(
    'utenti',
    [qw/ id username indirizzo /],
    { ruolo => 'cliente' }
);

Un oggetto SQL::Abstract verrà automaticamente creato la prima volta che viene invocato un metodo che ne fa uso (naturalmente è necessario aver installato il modulo). È anche possibile fornire un oggetto proprio, scelta peraltro raccomandata poiché in questo modo è possibile sfruttare SQL::Abstract::Limit:

use DBIx::Simple;
use SQL::Abstract::Limit;

my $db = DBIx::Simple->new(
    'dbi:mysql:database=mio;host=miohost', 'miouser', 'miapass'
);

$db->abstract = SQL::Abstract::Limit->new(
    limit_dialect => $db->dbh
);

Esiste anche un metodo $res->text che è piuttosto utile per il debugging, poiché visualizza i risultati di una query in vari formati.

In definitiva, DBIx::Simple non fornisce funzionalità addizionali a DBI, ma è come zucchero sparso sopra esso (lo si sarebbe dovuto chiamare più appropriatamente DBI::Sweet). Il suo utilizzo rende il codice più leggibile, e più rapido da scrivere.

Inviato da arthas il 09.08.06 15:42
Ti è piaciuto questo articolo? Iscriviti al feed!










Devo ricordare i dati personali?






D:
Sull'autore...
D:
La ML di Perl.it
Iscriviti! mongers@lists.perl.it è la lista ufficiale di Perl Mongers Italia per porre quesiti di tipo tecnico, per rimanere aggiornato su meeting, incontri, manifestazioni e novità su Perl.it.
D:
Annunci Google