Para describir la base de datos de manera que los objetos puedan ser
construidos porClass::DBI
se requieren varios pasos.
Es conveniente establecer una clase base de la cual hereden las clases
asociadas con las diferentes tablas. La introducción de esta clase
proporciona un lugar conveniente para las sobreescrituras y extensiones
que queramos hacer a Class::DBI
.
$ cat -n synopsis1.pl 1 package Music::DBI; 2 use strict; 3 4 use base 'Class::DBI'; 5 Music::DBI->connection("dbi:SQLite:example.db");
Lo primero es conocer como acceder a la base de datos. Esto se hace por medio del método connection. Esto hace que todas las clases/tabla que heredan de la clase base compartan la misma conexión.
7 package Music::Artist; 8 use base 'Music::DBI'; 9 Music::Artist->table('artist'); 10 Music::Artist->columns(All => qw/artistid name/); 11 Music::Artist->has_many(cds => 'Music::CD'); 12 13 package Music::CD; 14 use base 'Music::DBI'; 15 Music::CD->table('cd'); 16 Music::CD->columns(All => qw/cdid artist title/); 17 Music::CD->has_many(tracks => 'Music::Track'); 18 Music::CD->has_a(artist => 'Music::Artist'); 19 20 package Music::Track; 21 use base 'Music::DBI'; 22 Music::Track->table('track'); 23 Music::Track->columns(All => qw/trackid cd title/); 24 25 my $artist = Music::Artist->insert({ name => 'U2' }); 26 27 my $cd = $artist->add_to_cds({ 28 title => 'October', 29 }); 30 31 $cd->update;
Ejecución:
lhp@nereida:~/Lperl/src/CLASS_DBI$ perl synopsis1.pl lhp@nereida:~/Lperl/src/CLASS_DBI$ sqlite3 example.db SQLite version 3.3.8 Enter ".help" for instructions sqlite> .dump BEGIN TRANSACTION; CREATE TABLE artist ( artistid INTEGER PRIMARY KEY, name TEXT NOT NULL ); INSERT INTO "artist" VALUES(1, 'Michael Jackson'); INSERT INTO "artist" VALUES(2, 'Eminem'); INSERT INTO "artist" VALUES(3, 'U2'); CREATE TABLE cd ( cdid INTEGER PRIMARY KEY, artist INTEGER NOT NULL REFERENCES artist(artistid), title TEXT NOT NULL ); INSERT INTO "cd" VALUES(1, 1, 'Thriller'); INSERT INTO "cd" VALUES(2, 1, 'Bad'); INSERT INTO "cd" VALUES(3, 2, 'The Marshall Mathers LP'); INSERT INTO "cd" VALUES(4, 3, 'October'); CREATE TABLE track ( trackid INTEGER PRIMARY KEY, cd INTEGER NOT NULL REFERENCES cd(cdid), title TEXT NOT NULL ); INSERT INTO "track" VALUES(1, 3, 'The Way I Am'); INSERT INTO "track" VALUES(2, 3, 'Stan'); INSERT INTO "track" VALUES(3, 1, 'Billie Jean'); INSERT INTO "track" VALUES(4, 2, 'Leave Me Alone'); INSERT INTO "track" VALUES(5, 2, 'Smooth Criminal'); INSERT INTO "track" VALUES(6, 1, 'Beat It'); INSERT INTO "track" VALUES(7, 2, 'Dirty Diana'); COMMIT; sqlite>
lhp@nereida:~/Lperl/src/CLASS_DBI$ cat -n synopsis2.pl 1 #!/usr/local/bin/perl -w .. .............................. # like in the former example 25 26 my $cd = Music::Artist->search_like(name => 'Eminem')->first; 27 28 print $cd->artistid,": ",$cd->name,"\n"; 29 30 my $first = Music::Artist->retrieve(1); 31 print $first->name,"\n"; 32 33 print "CDs\n"; 34 for my $cd (Music::CD->retrieve_all) { 35 print "\t",$cd->title,"\n"; 36 }
lhp@nereida:~/Lperl/src/CLASS_DBI$ perl synopsis2.pl 2: Eminem Michael Jackson CDs Thriller Bad The Marshall Mathers LP