大きなMySQLテーブルをフェッチし、いくつかのフィールドの名前を変更してJSONに書き込むプログラムを作成しようとしています。ここで私は今のところ持っているものです。DBIがフェッチされた配列参照をハッシュに変換する
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}
に、行インタープリタが文句を言い、$res
がNot a HASH reference
であるということです。
誰でも私の間違いを指摘できますか?
あなたが直接 'json'形式で出力を得るために**のmysql-シェル出力形式を使用することができます[JSON形式の出力](https://dev.mysql.com/doc/refman/5.7/en/mysql-shell-output-formats.html) – AbhiNickz
またはこの[DBIx :: JSON](http://search.cpan.org /yyyy/DBIx-JSON-0.02/lib/DBIx/JSON.pm#get_json) – AbhiNickz
@martinclayton、これは分かりますが、 'fetchall_hashref'はバッチ処理の行数を含むシグネチャがないようです。私が間違っているなら、私を訂正してください。 –