我想查询一个sqlite数据库并返回一个对象数组。
我正在创建一个电报机器人,我必须存储每个user_id的最后一条消息的日期,因为电报API会返回我已经阅读的消息。因此,我创建了一个带有两个表的sqlite db:用户和消息;用户包含所有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";
}
我希望我的选择返回一个对象数组,而不必每次都重新创建它。
答案 0 :(得分:2)
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";
}