Mysql DBI将获取的arrayref转换为哈希

Mysql DBI将获取的arrayref转换为哈希,mysql,perl,dbi,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( @$rowc

我正试图编写一个程序来获取一个大的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++;
}
我使用了数据库行缓存技术 一切似乎都很好

我现在唯一的问题是,在$res->{some_field}=$res->{other_field}上,行解释器抱怨说$res不是散列引用

有谁能指出我的错误吗?

如果要返回hashref数组,第一个参数应该是hashref。否则,将返回arrayrefs数组,导致Not哈希引用错误。因此,为了将整行返回为hashref,只需传递一个空哈希:

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

您可以使用mysql shell输出格式直接获取json格式的输出,或者使用@martinclayton,我理解这一点,但fetchall_hashref似乎没有任何包含批处理行数的签名。如果我错了,请纠正我。@AbhiNickz,这真是一个超过2亿条目的巨大数据库表。它是否提供了将数据分解成块的可能性?此外,我需要在获取重命名之后进行一些处理,等等……不是为第一个参数传递undf,而是传递一个空的hash引用,然后您应该返回一个hash ref数组的ref。i、 e.fetchall_arrayref{},$max_行。fetchall_arrayref的文档说,如果第一个参数未定义,您将获得一个数组引用。感谢您的帮助,但现在它说由于某种原因,无法将未定义的值用作数组引用。。。我遗漏了什么吗?只是猜测:似乎应该将rowcache初始化为某个值?@mr.nothing尝试使用我的$rowcache=[];)初始化rowcache;。不幸的是,没有运气。将尝试进一步调查。@nwellnhof:使用未定义的标量作为数组引用将自动验证空匿名数组,并将标量设置为引用它。不会出现任何错误。问题是fetchall_arrayref在到达表的末尾时返回undef