Mojolicious数据库操作(四)
一、数据库的异步并发操作
$db的query_p方法可以非堵塞的执行数据库查询操作。我们可以用Promise异步的等待查询操作结果的返回。从而形成了一个并发处理的过程。Mojo::Promise的操作和javascript中的promise异步操作很像。
my $now = $db->query_p('select now() as now'); #做两条SQL查询语句 my $names = $db->query_p('select * from names'); Mojo::Promise->all($now, $names)->then(sub { #用Mojo::Promise异步等待$now、$name这两个SQL查询语句结果的返回。 #之后通过then对返回的结构进行异步的操作。 my ($now, $names) = @_; say $now->[0]->hash->{now}; say $_->{name} for $names->[0]->hashes->each; })->catch(sub { #如果过程中存在错误,则catch方法捕捉异常。 my $err = shift; warn "Something went wrong: $err"; })->wait; Mojo::IOLoop->start unless Mojo::IOLoop->is_running;
二、Mojo::mysql概述
前面我们三篇文章,我们通过一系列的简单操作,熟悉了一下Mojo::mysql的一些用法。现在,我们深入的讲解其中的概念。
Mojo::mysql是 DBD::mysql 和 DBD::MariaDB两个模块的简单封装。他主要是为了方便在Mojolicious框架中使用的。但是,我们也可以把它拿出来单独使用,实际上我个人感觉这个模块要比DBI好用多了。
Mojo::mysql如上所述,他同时支持MySQL和MariaDB数据库,我们可以方便的在Linux环境下选择其中任意一个(现在的Linux对于MariaDB的要更好一些)。
Mojo::mysql的封装,可以保证我们在Mojolicious中轻松地使用数据库,而不用担心数据库的连接问题,比如超时断开、每个网页的controller(也就是sub方法)如何共用一个连接等等。我们这里讲的连接,定义了一个专有名词——句柄,英文handler。
use Mojolicious::Lite; use Mojo::mysql; helper mysql => sub { state $mysql = Mojo::mysql->strict_mode('mysql://sri:s3cret@localhost/db') }; #我们通过helper方法,将数据库句柄直接加入到$c全局变量中。 get '/' => sub { my $c = shift; my $db = $c->mysql->db; #通过$c->mysql我们可以轻松地在任意一个网页中调用数据库。 $c->render(json => $db->query('select now() as time')->hash); }; app->start;