-+  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






 


« Ottobre 2005 | Home | Dicembre 2005 »

Pillola di Novembre: Class::DBI

La "pillola di Perl" su Computer Programming questo mese parla di Class::DBI, con un articolo di Stefano Rodighiero.

Il compito non è facile: ho solo 2000 caratteri, e devo spiegare qualcosa di pratico da fare in Perl. Niente oneliner o tecniche simili: Perl è uno strumento che permette magie ben più potenti. E come se non bastasse ho già usato 200 caratteri solo per divagare! Dove non sarò io abbastanza stringato, dunque, lo sarà Perl.

Class::DBI

Se si parla di grandi risultati con piccolo sforzo, Class::DBI (CDBI) è un bell’esempio.

Supponiamo di avere la seguente tabella in un database:

CREATE TABLE persone (
    id int unsigned not null auto_increment,
    nome varchar( 50 ),
    cognome varchar( 50 ),
    primary key( id )
);

Se si adoperasse solo DBI (lo standard Perl per manipolare database) bisognerebbe scrivere codice Perl per la connessione al DB, codice SQL per le query, e così via. Con Class::DBI, invece, prepariamo per prima cosa una classe di configurazione con i parametri di connessione al DB (uso MySQL, ma non siamo vincolati a questo RDBMS):

package App::DBI;
use base 'Class::DBI'; # la superclasse e` Class::DBI
App::DBI->set_db(Main => 'dbi:mysql:mydb', 'login', ‘password');
1;

E ora una sottoclasse che rappresenta gli oggetti Persona, corrispondenti alle righe della tabella:

package App::Persona;
use base 'App::DBI';
App::Persona->table('persone');
App::Persona->columns( All => qw/ id nome cognome / ); 
1;

Tutto qui.
CDBI provvede automaticamente a generare i metodi per il fetch e lo store di record, gli accessor/mutator per ogni campo (avranno il nome delle colonne della tabella), un metodo search() per impostare criteri di selezione, e così via. Per un esempio, inserite qualche riga nella tabella e poi usate il codice del Listato 1.

CDBI fà molte altre cose. Visto però che la gestione di relazioni tra tabelle è fondamentale, vediamone un esempio. Supponiamo che le persone siano in realtà impiegati, e che ciascuno lavori in un certo ufficio. Avremo quindi una tabella ufficio (vedere il Listato 2), la cui chiave primaria sarà referenziata nella tabella persone (dove dunque dovremo aggiungere un colonna). La classe App::Ufficio sarà molto simile a quella già vista:

package App::Ufficio;
use base 'App::DBI';
App::Ufficio->table('uffici');
App::Ufficio->columns( All => qw/ id label / );
App::Ufficio->has_many( impiegati => ‘App::Persona’ );
1;

Attenzione a has_many()! Stabilisce che altri oggetti saranno legati alle istanze della classe che abbiamo definito.

Simmetricamente, aggiungeremo ufficio alle colonne della classe App::Persona.
Modifichiamo la chiamata a columns() come segue:

App::Persona->columns( All => qw/ id nome cognome ufficio / );

Indichiamo poi che ufficio è un riferimento ad una instanza della classe App::Ufficio:

App::Persona->has_a( ufficio => ‘App::Ufficio’ );

Nel Listato 2 c’è un esempio che mostra il funzionamento di quello che abbiamo preparato.

Spero di essere riuscito a mostrare un po’ della potenza di CDBI. Attenzione però! Non sempre le tabelle SQL si possono mappare direttamente in classi. L’adozione di strumenti potenti come CDBI non può non passare attraverso una attenta fase di progettazione.

Listato 1

#!/usr/bin/perl

use strict;
use warnings;

use App::Persona;

my $persone = App::Persona->retrieve_all();
# $persone e` un iteratore

while( defined( my $c = $persone->next() )) {
    print $c->nome() . " " . $c->cognome() . "\n";
}

Listato 2

#!/usr/bin/perl

# CREATE TABLE uffici (
#    id int unsigned not null auto_increment,
#    label varchar( 50 ),
#    primary key( id )
# );
# 
# CREATE TABLE persone (
#    id int unsigned not null auto_increment,
#    nome varchar( 50 ),
#    cognome varchar( 50 ),
#    ufficio int unsigned,
#    primary key( id )
# );

use strict;
use warnings;

use App::Persona;
use App::Ufficio;

my $uffici = App::Ufficio->retrieve_all();

while( defined( my $u = $uffici->next() )) {
	print $u->label() . "\n";

	my $impiegati = $u->impiegati();

    while (defined( my $i = $impiegati->next() )) {
		print "\t" . $i->nome() . " " $i->cognome . "\n";
	}
}

Inviato da larsen alle 18:10 | Commenti (0)

VII Pisa.pm meeting - 1 dicembre 2005

Il gruppo Pisa.pm è lieto di annunciare il VII Pisa.pm "Xmas 05" meeting che avrà luogo il 1 dicembre 2005 presso il Bed & Breakfast Villa Fiona - Le Risaie

Non è previsto un costo di registrazione.

Il programma è il seguente:

17:30 - opening
17:45 - "Gtk2 e Glade: come scrivere una GUI senza diventare matti" di Gianni Ceccarelli
18:30 - "POD2::* and Perl translation documentation project" di Enrico Sorcinelli
18:45 - Intervento di Michel "mirod" Rodriguez
19:15 - "svk - Version Control without the Headaches" di Chia-liang Kao (clkao)
20:15 - Aperitivo e inizio baccanali

Durante e dopo la cena si parlerà ovviamente dell'organizzazione dell'Italian
Perl Workshop 2006, e anche di altre amenità non sempre necessariamente attinenti al Perl ;-)

Chi è interessato a partecipare (per chi vuole rimanere a dormire, i prezzi sono più che accettabili) è pregato di comunicarlo quanto prima in uno dei seguenti canali:

E-mail: info [at] pisa.pm.org
Mailing list Pisa.pm: http://mail.pm.org/mailman/listinfo/pisa-pm
Canale IRC: irc.slashnet.org, canale #nordest.pm

Inviato da bepi alle 13:23

Perl Day: 26 Novembre 2005

E' oramai tradizione che, in occasione del Linux Day (che quest'anno sarà il 26/11/2005), vengano proposti interventi about Perl in qualche LUG e da qui il nome in codice di "PerlDay" :-)

Il Linux Day è tra l'altro anche l'occasione per incontrarsi tra perlisti (o perl monger, o perlivendoli, quel che volete...).

La lista attualmente degli interventi in programma è la seguente:

- LUG Chieti: "Programmazione in Perl" di nathanvi
- LUG Grosseto: "Gtk2 e Glade: come scrivere una GUI senza diventare matti" di dakkar
- LUG Pistoia: "SpamAssassin: il killer della mail spazzatura" e "Costruire una (large) web application con HTML::Mason" di bepi
- LUG Trieste: Perl for everyday life di Ugo Tartaglino

Usate i commenti per segnalare altre presenze, talk e cose di questo genere in giro per l'Italia. About Perl, al solito.

Inviato da bepi alle 15:14

POD2::IT 0.10

Il team di pod2it è lieto di annunciare una nuova release di POD2::IT disponibile su CPAN .

CHANGES FROM PREVIOUS VERSION

+ Added perlmod.pod translation [frodo72]
+ Added perldata.pod translation [frodo72]
+ Added perlnewmod.pod translation [dree]
+ Added perlxstut.pod translation [frodo72]
! resources/podenc.pl fixes [frodo72]
! Minor fixes to perlfaq4, perlfaq7, perlfunc, perlreref
! Added 'TRANSLATION' section to all pods, containing
  some infos about pod translator(s) and reviewer(s) [bepi]

Inviato da bepi alle 10:04

Advanced Perl Programming, 2nd Ed. - Recensione

Pubblichiamo la recensione di "Advanced Perl Programming, 2nd Edition", di Simon Cozens. La recensione, opera di kral, si può discutere nei commenti a questa entry.

Inviato da larsen alle 21:31 | Commenti (0)

D:
Progetti e documenti in rilievo
Corso di Perl Progetto pod2it
D:
La ML di Perl.it
mongers@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.
Iscriviti!
D:
Annunci Google