http://www.perlmonks.org?node_id=183101


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:
My::User->set_sql( 'getUsers', 'select * from users', 'Main' );
Which you can then retrieve in anything that uses the class:
my $sth = My::User->sql_getUsers; $sth->execute(); # etc
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:
$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:

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');
Now like magic you have a class to talk to the database and hide you from the horrors of SQL:
my $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;
or
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^