Perl 生成 SELECT 查询和 return 对象数组

Perl make a SELECT query and return array of objects

我想查询一个 sqlite 数据库和return一个对象数组。

我正在创建一个电报机器人,我必须存储每个 user_id 的最后一条消息的日期,因为我已经阅读过电报 API return 的消息。所以我创建了一个包含两个表的 sqlite 数据库:用户和消息; users 包含所有 user_id 和用户名;消息包含我读过的最后 message_id。

我已经完成了这个功能,它可以工作,但性能不是很好,因为它必须重新创建整个对象数组 (fetchrow_hashref)。

sub sqlLiteSelect {
    my ($db,$table,$columnsRef,$where,$others) = @_;
    my $columns = join(', ', @{ $columnsRef });
    $others ||= '';
    my $query = "select ${columns} from ${table} ${where}${others}";
    my $obj = $db->prepare($query);
    my $ret = $obj->execute() or die $DBI::errstr;
    my @array = ();
    while(my $row = $obj->fetchrow_hashref) {
        my $tmp = {};
        foreach my $column (@{ $columnsRef }) {
            $tmp->{$column} = $row->{$column};
        }
        push @array, $tmp;
    }
    return @array;
}

my @columns  = ('user_id','first_name','username','type');
my $where = ' where user_id in (1,2)';
my @result = sqlLiteSelect($db,'users',\@columns,$where,'');
foreach my $row (@result) {
    print "user_id=$row->{user_id}, username=$row->{username}\n";
}

我希望我的 select 到 return 一个对象数组,而不是每次都重新创建它。

my ($user_id, $first_name, $username, $type);

my $sql = q{
SELECT user_id, first_name, username, type
  FROM users
 WHERE user_id IN (1,2)
};

my $sth = $db->prepare($sql);
$sth->execute or die $DBI::errstr;
$sth->bind_columns($user_id, $first_name, $username, $type);

while ($sth->fetch) {
    print "$user_id, $username\n";
}

阅读文档https://metacpan.org/pod/DBI#bind_columns