in reply to How to structure applications using a RDBMS
You might want to look at two cunning modules by Michael Schwern/Tony Bowden, Ima::DBI and Class::DBI. The first gives all your classes nice cached DBI handles and SQL statements. In your class you set up your SQL statements:
Which you can then retrieve in anything that uses the class:My::User->set_sql( 'getUsers', 'select * from users', 'Main' );
I like this approach because all the SQL lives in a seperate module and doesn't mess up your main application. It also has some handy shortcuts like:my $sth = My::User->sql_getUsers; $sth->execute(); # etc
$sth->execute([qw/value1 value2/], [\my $res1]); my %hash = $sth->fetch_hash;
Now Class::DBI is a great abstraction layer if, like me, you don't like to play with SQL at all. An example:
Now like magic you have a class to talk to the database and hide you from the horrors of SQL:package User; use base 'Class::DBI'; User->table('users'); User->columns('All', qw/id name password/); User->coumns('Primary', 'id'); User->set_db('Main', 'dbi:mysql', 'gav', 'perlmonks');
ormy $user1 = User->new({ name => 'gav', password => 'monk' }); my $user2 = User->retrieve(1023); printf "Id: %d, Name: %s, Pass %s\n", $user2->id, $user2->name, $user2->password;
my $user = User->search(name => 'gav'); if ($user && ($user = $user->next) && $user->password eq 'monk') { print "Welcome gav^!\n"; } else { print "Schoo!\n"; }
This came out a bit longer than I expected, but I hope it might help somebody :)
gav^
In Section
Seekers of Perl Wisdom