我记得DBI方法selectrow_array
有问题。当我不够整洁时,我从它回来的不是我要求的列的价值,而是列的数量(或者不需要的东西,我不记得确切)。现在我尝试重构一些代码,我想确保在每个可能的地方,我只回到预期的价值。所以我尽量避免意外,并找出不良行为。从DBI文档中我读到这可能是一个真正有问题的情况:
如果在标量上下文中调用具有更多的语句句柄 比一列,未定义驱动程序是否将返回 第一列或最后一列的值。所以不要这样做。另外,在 标量上下文,如果没有更多行或if,则返回“undef” 发生错误。那个“undef”无法与“undef”区别开来 返回,因为第一个字段值为NULL。由于这些原因 如果你在a中使用“selectrow_array”,你应该谨慎行事 标量上下文,或者只是不这样做。
仍然我不能强迫selectrow_array
返回col1
的任何值(这就是我所期待的)
my $query = 'SELECT col1, col2, col3 FROM table WHERE id = 112233';
my ( $c ) = ( $dbh->selectrow_array( $query ) );
my $x = ask_from_db();
my $y = $dbh->selectrow_array( $query );
my $z = ( $dbh->selectrow_array( $query ) );
my @A = $dbh->selectrow_array( $query );
say "C: $c"; # C: col1
say "X: $x"; # X: col1
say "Y: $y"; # Y: col1
say "Z: $z"; # Z: col1
say "A: @A"; # A: col1 col2 col3
sub ask_from_db {
return $dbh->selectrow_array( $query );
}
我上面提到的每一种方式都给了我很好的结果。我应该如何运行查询以获得错误的结果?
错误的结果!= col1
值
答案 0 :(得分:3)
文档的含义是“未定义驱动程序是否返回第一列或最后一列的值”是返回的列是由数据库驱动程序定义的,而不是DBI
。
因此Postgres驱动程序可能决定始终返回第一列,而mysql驱动程序可能总是返回最后一列,或者返回的列可能取决于查询。
所以不要调用selectrow_array
是标量上下文 - 总是在列表上下文中调用它:
my @row = $sth->selectrow_array($query)
并且您将避免文档中提到的所有问题。
答案 1 :(得分:3)
结果的差异将基于驱动程序的实现。
wantarray ? @row : $row[0]
VS
wantarray ? @row : $row[-1]
您将使用不同的驱动程序来获得不同的结果。也就是说,我想你会很难找到一个不会返回第一个的驱动程序。
如果您想确保获得第一个,请使用:
( $dbh->selectrow_array( $query ) )[0]