使用selectall_hashref,因为我会选择all_arrayref

时间:2013-05-13 22:15:26

标签: perl dbi

我正在做一些练习来提高我的Perl技能,其中一个涉及连接到SQL数据库,运行查询,并将结果作为数组返回。这就是我到目前为止所做的:

my $search = $_[0];
our $dbh = DBI->connect{"dbi:mysql:dbname=database", "root", "password")
    or die $DBI::errstr;
my $sql = $dbh->selectall_arrayref("SELECT Player from Players_Sport where Sport like '$search'")
    or die $DBI::errstr;
my @array = map { $_->[0] } @$sql;
$dbh->disconnect
    or warn "Disconnection failed: $DBI::errstr\n";
return @array;

我的下一步是更改代码以将结果作为哈希而不是数组返回,但我不确定如何继续。我希望使用selectall_hashref,但我发现的所有在线示例都使用WHILE。我想返回结果,然后创建哈希作为单独的步骤。

3 个答案:

答案 0 :(得分:6)

使用selectall_hashref方法将prepareexecutefetchall_arrayref合并为一个调用。它返回对数组的引用,该数组包含对每个获取数据行的哈希的引用。添加到以前的回复评论中。

selectall_arrayref来电变为类似哈希的详细方式,ID是您的主键,您可以这样做。

my %rows = ();
for my $i ( 0..$#{$sql} ) {
  my ($id, $player, $sport) = @{$sql->[$i]};
  $rows{$id} = [ $player, $sport ];  
}

现在要访问它们:

foreach ( sort(keys(%rows)) ) {
   print "$_, -> $rows{$_}->[0], -> $rows{$_}->[1]\n";
}

现在使用selectall_hashref,您的通话将是这样的。 ID是此处的primary密钥。

my $href = $dbh->selectall_hashref( q/SELECT ID, Player, Sport 
                                      FROM Players_Sport/, q/ID/ );

要访问您的密钥,您可以通过多种方式使用,这是一个示例:

foreach ( keys %$href ) {
   print "$_, $href->{$_}->{Player}, $href->{$_}->{Sport}\n";
}

您的主键位于$_,您可以通过声明从哈希中访问您的个人密钥。

$href->{$_}->{Player}

再次就像说:

foreach my $i ( keys %$href ) {
   print "$i, $href->{$i}->{Player}, $href->{$i}->{Sport}\n";
}

每个项目都在循环$i

答案 1 :(得分:3)

使用selectall_hashref时,必须告诉它使用哪个列作为唯一键。指定一个您知道每行具有唯一值的列,然后使用键列值作为键,使用“行”对象填充哈希。每个'row'本身都是一个hashref,列名作为键。

从DBI页面:

$hash_ref = $dbh->selectall_hashref($statement, $key_field);
$hash_ref = $dbh->selectall_hashref($statement, $key_field, \%attr);
$hash_ref = $dbh->selectall_hashref($statement, $key_field, \%attr, @bind_values);

在所有三个版本中,您提供$key_field来标识将用作哈希键的列。

答案 2 :(得分:0)

哈希定义了两件事之间的关联,但在这种情况下,关键或值是什么?假设您想要1作为值:

my %hash = map { $_, 1 } @array;

,或者

my %hash = map { $_->[0], 1 } @$sql;