Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling

Seeking guidance for web/db application

by neilwatson (Priest)
on Mar 13, 2014 at 18:29 UTC ( #1078222=perlquestion: print w/replies, xml ) Need Help??
neilwatson has asked for the wisdom of the Perl Monks concerning the following question:


I seldom venture in the web end of the Perl pool, but am doing so now and I seek your advice. I'm using Mojolicious and I'm thinking about how to divide up my code. I was thinking of using a module for database functions, but am wondering how I'm going to pass DB handles back and forth. For example:

DB module:

sub new { bless {}; shift } sub connect { my $self = shift; my %param = @_; my $table = "cf_status_log"; my $dbh = DBI->connect( "DBI:Pg:dbname=$param{'db_name'}; host=$param{'db_host'}", "$param{'db_user'}", "$param{'db_pass'}", { RaiseError => 1 } ) or die "Could not connect to database"; return $dbh; }; sub inventory_query { my $dbh = shift; my $result = $dbh->prepare( "SELECT * FROM dr_inventory_classes" ) || die "Could not prepare" ; } 1;

And the main app:

use lib 'lib'; use DeltaR; my $dr = DeltaR->new; sub dbh { my $self = shift; my $dbh = $dr->connect( db_name => "postgres", db_user => "postgres", db_pass => "", db_host => "" ); return $dbh; }; get '/inventory' => sub { my $self = shift; my $dbh = dbh; my $rows = $dr->query_inventory( $dbh ); $self->stash( title => "Inventory report", record_limit => $record_limit, rows => $rows, columns => [ 'Count', 'Class' ] ); } => "rtable"; app->start;

I don't want to make unneeded connections because not all pages will require the database. I don't know if handle passing like this is the best approach. How would you do it? Passing $dbh around is a bit fiddly. Is there a better way?

Neil Watson

Replies are listed 'Best First'.
Re: Seeking guidance for web/db application
by davido (Archbishop) on Mar 13, 2014 at 20:21 UTC

    Make the database handle an attribute stored in the Mojolicious application class. Better yet, make a DBIx::Connector object an attribute stored in the application class. Either way, that attibute will be available from within the controller, and can then be passed to your model. See the following Mojolicious documentation that shows examples both for full Mojolicious apps, and for Mojolicious::Lite apps:


Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1078222]
Approved by Limbic~Region
NodeReaper wonders through a maze of twisty little sayings, all alive

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (2)
As of 2017-05-23 01:36 GMT
Find Nodes?
    Voting Booth?