Mojolicious数据库操作(十)

一、insert_p

此处类似delete_p的异步插入方法:

my $promise = $db->insert_p($table, \@values || \%fieldvals, \%options);
$db->insert_p(some_table => {foo => 'bar'})->then(sub {
  my $results = shift;
  ...
})->catch(sub {
  my $err = shift;
  ...
})->wait;

二、pid

返回连接使用进程id

my $pid = $db->pid;

三、ping

检查数据库连接是否正常

my $bool = $db->ping;

四、query

对于一个习惯使用SQL语句的开发者来说,query是最终要的一个函数。因为SQL语句的增删改查均在此方法上实现。

my $results = $db->query('select * from foo');
my $results = $db->query('insert into foo values (?, ?, ?)', @values);
my $results = $db->query('insert into foo values (?)', {json => {bar => 'baz'}});
my $results = $db->query('insert into foo values (?)', {type => SQL_INTEGER, value => 42});

query是一个堵塞查询,query方法返回Mojo::mysql::Results 的对象,后续我们会详细的讲解该模块。

与其他堵塞方法类似,同样可以有非堵塞实现:

$db->query('select * from foo' => sub {
  my ($db, $err, $results) = @_;
  ...
});
Mojo::IOLoop->start unless Mojo::IOLoop->is_running;

介绍query方法最开始的四个例子中的第三项,我们使用了一个散列引用作为SQL语句紧跟的参数,散列中的键使用了“json”,这意味着将调用Mojo::JSON模块的to_json方法,使{bar => ‘baz’}编码为JSON格式并存入是数据库中。

既然可以将数据内容压缩为json格式然后存入一个数据库字段中,同样也可以反过来操作:这将使用Mojo::mysql::Results模块的expand方法,他会自动的将得到的值转换为perl的数据结构:

$db->query('insert into foo values (x) values (?)', {json => {bar => 'baz'}});
$db->query('select * from foo')->expand->hash->{x}{bar}; # baz

利用DBI模块的数据类型,我们可以指定插入数据的类型:

# Insert binary data
use DBI ':sql_types';
$db->query('insert into bar values (?)', {type => SQL_BLOB, value => $bytes});
#如上所示,我们插入一个散列参数,type对应DBI中的特殊类型,value对应着数据的值

五、query_p

这是query对应的异步方法:

my $promise = $db->query_p('select * from foo');
$db->query_p('insert into foo values (?, ?, ?)' => @values)->then(sub {
  my $results = shift;
  ...
})->catch(sub {
  my $err = shift;
  ...
})->wait;

 

标签