Как я могу получить одно значение счетчика из базы данных с DBI? - PullRequest
17 голосов
/ 01 ноября 2009

Следующий код кажется слишком большим для получения единственного значения счетчика. Есть ли лучший, рекомендуемый способ получить одно значение COUNT, используя обычный DBI?

sub get_count {
   my $sth = $dbh->prepare("SELECT COUNT(*) FROM table WHERE...");
   $sth->execute( @params );
   my $($count) = $sth->fetchrow_array;
   $sth->finish;

   return $count;
}

Это короче, но у меня все еще есть два утверждения.

sub get_count_2 {
   my $ar = $dbh->selectall_arrayref("SELECT ...", undef, @params)
   return $ar->[0][0];
}

Ответы [ 3 ]

34 голосов
/ 01 ноября 2009

Достаточно просто сделать в одной строке без дополнительных переменных:

$count = $dbh->selectrow_array('SELECT count(*) FROM table WHERE...', undef, @params);
3 голосов
/ 01 ноября 2009

Я не знаю Perl, но если его синтаксис логичен, я думаю, что это сработает, основываясь на вашем втором примере:

sub get_count {
   return $dbh->selectall_arrayref("SELECT ...", undef, @params)->[0][0];
}
1 голос
/ 01 ноября 2009

Я бы, наверное, сам этого не сделал, но вы всегда могли бы сделать это новой функцией верхнего уровня объекта DBH, который вы используете:

ВНИМАНИЕ: непроверенный код следует!

sub DBD::SQLite::db::count
{
   my($dbh, $table, $where) = @_;

   my($stmt) = "SELECT COUNT(*) FROM $table";
   $stmt .= " WHERE $where" if $where;

   my($count) = $dbh->selectrow_array($stmt);

   return $count;

}

и затем назовите это так:

my($cnt) = $dbh->count('Employee', 'year_hired < 2000');

Помимо загрязнения пространства имен, которое не принадлежит вам, вам также придется писать это для каждого используемого вами драйвера БД, хотя я уверен, что вы могли бы что-то обработать, что позволит вам создать и оценить некоторый код для автоматической настройки для данного объекта DBH.

...