#####################################
package Model::Base;
use Mojo::Base -base;
has [qw(dbh)], undef, weak=>1;
has qw(sth_cached);#
sub insert_default_values {
my ($self, $schema, $table,) = splice @_,0, 3;
warn ("_insert_default_values [$schema][$table] [@_]");
$self->dbh->selectrow_hashref($self->prepare_sth(sprintf(<<END_SQL,
insert into "%s"."%s"
DEFAULT VALUES
returning *, ? as "foo";
END_SQL
( $schema, $table,))), undef, @_);
}
sub prepare_sth {
my ($self, $sql, $cached) = @_;
$cached //= $self->sth_cached;
return $self->dbh->prepare_cached($sql)
if $cached;
return $self->dbh->prepare($sql);
}
1;
#####################################
package Model::Test;
use Mojo::Base 'Model::Base';
sub test1 {
my ($self, $id, $req_id) = @_;
my $s = $self->foo($id)
if $id;
$s ||= $self->insert_default_values("public", "test", $req_id); # вот эта строчка запускается только для первого запроса
return $s;
}
1;
################################
package main;
use Mojo::Base 'Mojolicious';
use DBI;
use Mojo::Util qw(dumper);
has dbh => sub {
my $dbh = DBI->connect('dbi:Pg:dbname=dev2', 'postgres', undef,);
$dbh->do('create table if not exists public.test (id SERIAL not null primary key, ts timestamp not null default now());');
$dbh;
};
has model => sub {
Model::Test->new(dbh=>shift->app->dbh);
};
sub startup {
my $app = shift;
$app->secrets(['My secret pa$$phrase']);
my $r = $app->routes;
$r->get('/' => sub {
my $c = shift;
my $r = $c->app->model->test1($c->session->{foo}, $c->req->request_id);
$c->app->log->debug(dumper $r);
$c->render(text => $r->{id});
});
}
__PACKAGE__->new->start;