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;

 

标签