DBI将获取的arrayref转换为hash

时间:2016-12-21 12:32:10

标签: mysql perl dbi

我正在尝试编写一个程序来获取一个大的MySQL表,重命名一些字段并将其写入JSON。这就是我现在所拥有的:

use strict;

use JSON;
use DBI;

# here goes some statement preparations and db initialization

my $rowcache;
my $max_rows       = 1000;
my $LIMIT_PER_FILE = 100000;

while ( my $res = shift( @$rowcache )
    || shift( @{ $rowcache = $sth->fetchall_arrayref( undef, $max_rows ) } ) ) {

    if ( $cnt % $LIMIT_PER_FILE == 0 ) {

        if ( $f ) {
            print "CLOSE $fname\n";
            close $f;
        }

        $filenum++;
        $fname = "$BASEDIR/export-$filenum.json";

        print "OPEN $fname\n";
        open $f, ">$fname";
    }

    $res->{some_field} = $res->{another_field}
    delete $res->{another_field}

    print $f $json->encode( $res ) . "\n";

    $cnt++;
}

我使用了数据库行缓存技术 Speeding up the DBI 一切似乎都很好。

我现在唯一的问题是,在$res->{some_field} = $res->{another_field}上,行解释器会抱怨并说$resNot a HASH reference

请有人指出我的错误吗?

1 个答案:

答案 0 :(得分:4)

如果希望fetchall_arrayref返回一个hashref数组,则第一个参数应该是hashref。否则,返回一个arrayrefs数组,导致“Not a HASH reference”错误。因此,为了将完整行作为hashref返回,只需传递一个空哈希:

$rowcache = $sth->fetchall_arrayref({}, $max_rows)