实例化:
/* * String $host:MySQL ip;
$hs = new HandlerSocket($host, $port);
运用例子:
#9998为读取端口 详见上一篇handlersocket的安装
my $args = { host => 'localhost', port => 9998 }; my $hs = new Net::HandlerSocket($args);
$hs->openIndex($index, $dbname, $table, $key, $column);
运用例子:
my $res = $hs->open_index(0, 'test', 'user', 'PRIMARY', 'user_name,user_email,created'); die $hs->get_error() if $res != 0; #打开test数据的user表 以主键为key #这个为查询的列数,这里为三列,分别为:user_name,user_email,created其中'test'为schema名,'user'为表名,'PRIMARY'为索引名必须要有 为'PRIMARY'或者某个字段名,'user_name,user_email,created'为查询的列名。关于方法的open_index的第一个参数0,用来在每个Net::HandlerSocket对象中唯一标识一个表名。
$retval = $hs->executeSingle($index, $operation, $value, $number, $skip);
运用例子:
my $args = { host => 'localhost', port => 9998 }; my $hs = new Net::HandlerSocket($args); my $res = $hs->open_index(0, 'test', 'user', 'PRIMARY', 'user_name,user_email,created'); die $hs->get_error() if $res != 0; $res = $hs->execute_single(0, '>=', [ 1 ], 2, 0); # 此查询语句的意思是:查询主键大于或等于1,数据取2行 die $hs->get_error() if $res->[0] != 0; shift(@$res); # 这里我们要注意:execute_single方法的返回值类型为arrayref,其第一个元素为error code:如果为0,则为正常,否则不正常,数组从第 二元素开始即为返回的值,存储格式为 后面一行紧跟前面一行! #下面为分行打印这个数组的所有值 for (my $row = 0; $row <2 ; ++$row) { my $user_name= $res->[$row + 0]; my $user_email= $res->[$row+ 1]; my $created= $res->[$row + 2]; if ($user_name || $user_email || $created) { print "$user_name\t$user_email\t$created\n"; } else { last; } } $hs->close();
$retval = $hs->execute_single(3,'+', [5, 'zhongguo', '[email protected]','2011-01-08 13:51:33' ],1,0);
运用例子:
my $args = { host => 'localhost', port => 9999 }; my $hs = new Net::HandlerSocket($args); my $res = $hs->open_index(3, 'test', 'user', 'PRIMARY', 'user_id,user_name,user_email,created'); die $hs->get_error() if $res != 0; $res = $hs->execute_single(3,'+', [5, 'zhongguo', '[email protected]','2011-01-08 13:51:33' ],1,0); die $hs->get_error() if $res->[0] != 0; $hs->close();
$retval = $hs->executeDelete($index, $operation, $value, $number, $skip);
运用例子:
my $args = { host => 'localhost', port => 9999 }; my $hs = new Net::HandlerSocket($args); my $res = $hs->open_index(3, 'test', 'user', 'PRIMARY', 'user_name'); die $hs->get_error() if $res != 0; $res = $hs->execute_single(3,'=', [4],1,0,'D'); #DELETE user_id=4 的数据 print $res; die $hs->get_error() if $res != 0; $hs->close();
$retval = $hs->executeUpdate($index, $operation, $value, $number, $skip);
my $args = { host => 'localhost', port => 9999 }; my $hs = new Net::HandlerSocket($args); my $res = $hs->open_index(3, 'test', 'user', 'PRIMARY', 'user_name'); die $hs->get_error() if $res != 0; $res = $hs->execute_single(3,'=', [5],1,0,'U',['woaini']); #当user_id=5,更新'user_name'为woaini die $hs->get_error() if $res->[0] != 0; $hs->close();
my $rarr = $hs->execute_multi([ [ 0, '>=', [ 'foo' ], 5, 0 ], [ 2, '=', [ 'bar' ], 1, 0 ], [ 4, '<', [ 'baz' ], 10, 5 ], ]); for my $res (@$rarr) { die $hs->get_error() if $res->[0] != 0; shift(@$res); # ... }
execute_single方法的第一个参数需要跟之前open_index方法的第一个参数一致。第二个参数'='指定了检索条件,目前支持'=', '>=', '<=', '>'和'<'。第三个参数[ 'foo' ]为一个arrayref,指定了检索的key,其长度必须小于或者等于对应索引的列数。第四个和第五个参数指定了查询的limit和offset跳过位移。
execute_single方法的返回值类型为arrayref,其第一个元素为error code:
PS:
handlerscoket中有两个 重要的特性;
Write operations do not invalidate the query cache – Exactly what it sounds like, if you performed a write operation via HandlerSocket, you could potentially read stale data from the MySQL interface.
l 写操作并没有淘汰查询缓存 - 如果执行了写操作通过HandlerSocket,由于没有失效查询缓存, 那么你可能从MySQL读到旧的数据。
No support for auto increment – Exactly as it sounds, you couldn’t have auto-incrementing columns get an auto increment value on insert.
l 不支持自动递增 - 插入时无法从自增列上自动获得增量值
今天 我在测试把同一批数据插入一张数据表两次时 发现 插入第一次之后 不能插入第二次了 找了很久原因 看到第二个特性之后才想起 我们每次 openindex的时候都是要用到主键的 如果 这里 你要插入的数据的主键 已经存在数据库中了 就会报 121的错误。