Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re: How can I get a database handler with Mojolicious::Plugin::Database

by Veltro (Hermit)
on Apr 03, 2019 at 08:17 UTC ( [id://1232066]=note: print w/replies, xml ) Need Help??


in reply to How can I get a database handler with Mojolicious::Plugin::Database

Hi frazap

I thought that the way how they solved it in this example was pretty neat:

https://github.com/tempire/MojoExample/blob/master/lib/MojoFull.pm

They set up a helper 'db' inside of the startup method that handles the connection.

Hope this helps,

Veltro

edit And this is how I set up my connection:

my $schema = <YourSchemaLocation>::Schema->connect( "DBI:mysql:database=<DatabaseName>;host=localhost", "<LoginName>", "<Password>", { 'RaiseError' => 1, 'quote_char' => '`', # Needed in case you use reserved sym +bols such as: 'group' is a reserved symbol 'name_sep' => '.' } ) ; # In case you want debugging # $schema->storage->debug( 1 ) ;

Replace <YourSchemaLocation> with your schema, <DatabaseName> with your database, <LoginName> and <Password> with the MySQL credentials that you use.

edit 2: Two more links that could be of interest for you:

Replies are listed 'Best First'.
Re^2: How can I get a database handler with Mojolicious::Plugin::Database
by frazap (Monk) on Apr 03, 2019 at 09:11 UTC
    Hi Veltro

    Thanks for the suggestion. Eventually, the database handler was found with $c->app->_dbh_db(); Strange that the doc of the module does not describe this...

    I'm that code, which works
    use Mojolicious::Lite; use Mojolicious::Plugin::Database; use Data::Dumper; plugin 'Database' => { dsn => 'dbi:mysql:host=m...h:dbname=d....', username => 'd....r', password => '.....', options => { 'pg_enable_utf8' => 1, AutoCommit => 1, PrintErr +or =>0, RaiseError => 1 }, helper => 'db', }; get '/invtot' => sub { my $c = shift; $c->render("invtot"); }; post '/invtot' => sub { my $c = shift; my $p = $c->req->body_params->to_hash; print Dumper $p; print Dumper $c->app->_dbh_db(); my $dbh = $c->app->_dbh_db(); my $st = $dbh->prepare("SELECT * FROM jrn WHERE ti like ? ORDER BY + tri ASC") or die $dbh->errstr ; if (length $p->{'ztSearch'} > 0) { $st->execute($p->{'ztSearch'} . '%'); my $ar; while ($ar = $st->fetchrow_arrayref) { my @values = map {defined $_ ? ($_) : ('') } @$ar; print join(" ", @values), "\n"; } $st->finish; } }; app->start; __DATA__ #as above

    Now, I would prefer to have my statements prepared as the start of the application, one time after the connection is made, not at each page displayed. What's the best way to do this?

    frazap

      the database handler was found with $c->app->_dbh_db();

      The underscore often implies that the developer of the module meant these as 'private' (or internal) functions (and therefor may not be documented). I believe that that is also the case here. I looked at the source and there is definitely a helper created by the name 'db'. Try to use the method from the previous link that I gave you: A Simple Mojolicious/DBI Example

        Thanks for the link

        And yes, the correct way was just $controller->db to have the database handler

      If you are content with preparing them on the first invocation, you can use either ->prepare_cached or use the state keyword:

      post '/invtot' => sub { state $st = $dbh->prepare(...); $st->execute(...); };

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1232066]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others lurking in the Monastery: (3)
As of 2024-04-25 20:59 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found