Mojolicious数据库操作(三)

一、SQL::Abstract::mysql

如果你不想在query中使用SQL语句。mojo::mysql模块还有抽象化的操作,即通过使用方法来完成insert、update等操作:

$db->insert('names', {name => 'Isabel'});                           #插入操作,第一个参数为table名称,后面的散列中键对应字段名
say $db->select('names', undef, {name => 'Isabel'})->hash->{id};    #select查询操作,第二个参数为返回的字段名,undef意思与SQL语句*相同,最后的散列转化为SQL语句为where name='Isabel',最后返回一个散列。
$db->update('names', {name => 'Bel'}, {name => 'Isabel'});          #相当于update names set name='Bel' where name='Isabel'
$db->delete('names', {name => 'Bel'});                              #相当于delete from names where name='Bel'

二、查询返回多行数据

当我们的select查询返回多行字段时,可以像这样处理:

my $results = $db->query('select * from names');
while (my $next = $results->hash) {               # $results是一个Mojo::mysql::Results对象。对象的hash方法返回一个散列引用
                                                  # 此hash引用是查询结果的一行数据(row)的字段名键值对。
  say $next->{name};
}

三、堵塞查询与非堵塞查询

mysql数据查询实际上与访问网页一样,是一种网络读写操作,即IO操作。

既然是IO操作,便会有堵塞操作和非堵塞操作。所谓堵塞,即在IO操作过程中,我们只能等待其完成而不能在同时间内做其他操作。而非阻塞,与其相反,在进行IO操作的过程中,我们还能做其他操作。

# 这是获取查询到的全部rows的堵塞操作
$db->query('select * from names')
  ->hashes->map(sub { $_->{name} })->join("\n")->say;
 
# 这是获取查询到的全部rows的非堵塞操作
Mojo::IOLoop->delay(
  sub {
    my $delay = shift;
    $db->query('select * from names' => $delay->begin);
  },
  sub {
    my ($delay, $err, $results) = @_;
    $results->hashes->map(sub { $_->{name} })->join("\n")->say;
  }
)->wait;

 

 

 

 

标签