Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options

Re: How to structure applications using a RDBMS

by gav^ (Curate)
on Jul 19, 2002 at 01:10 UTC ( #183101=note: print w/replies, xml ) Need Help??

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;
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 :)


Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://183101]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (5)
As of 2017-08-18 07:08 GMT
Find Nodes?
    Voting Booth?
    Who is your favorite scientist and why?

    Results (295 votes). Check out past polls.