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;