使用selectall_hashref,因为我会选择all_arrayref

use*_*820 2 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;
Run Code Online (Sandbox Code Playgroud)

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

hwn*_*wnd 6

使用该selectall_hashref方法组合prepare,executefetchall_arrayref进入单个调用.它返回对数组的引用,该数组包含对每个获取数据行的哈希的引用.添加到之前的回复评论中.

将您的selectall_arrayref通话转换为类似哈希的详细方法ID是您的主键,您可以执行类似的操作.

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

现在访问它们:

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

现在使用selectall_hashref,你的电话会是这样的.ID是primary关键.

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

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

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

您的主键被放置为$_,您可以通过说出您可以访问哈希的各个键.

$href->{$_}->{Player}
Run Code Online (Sandbox Code Playgroud)

再说它就像说:

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

每个项目都在循环播放 $i