2016-12-21 4 views
2

大きな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}に、行インタープリタが文句を言い、$resNot a HASH referenceであるということです。

誰でも私の間違いを指摘できますか?

+0

あなたが直接 'json'形式で出力を得るために**のmysql-シェル出力形式を使用することができます[JSON形式の出力](https://dev.mysql.com/doc/refman/5.7/en/mysql-shell-output-formats.html) – AbhiNickz

+0

またはこの[DBIx :: JSON](http://search.cpan.org /yyyy/DBIx-JSON-0.02/lib/DBIx/JSON.pm#get_json) – AbhiNickz

+0

@martinclayton、これは分かりますが、 'fetchall_hashref'はバッチ処理の行数を含むシグネチャがないようです。私が間違っているなら、私を訂正してください。 –

答えて

4

fetchall_arrayrefにhashrefの配列を返す場合は、最初のパラメータはハッシュリファレンスにする必要があります。それ以外の場合は、配列参照の配列が返され、「ハッシュリファレンスではありません」というエラーが発生します。だから、単に空のハッシュを渡し、ハッシュリファレンスとして完全な行を返すために:

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

助けていただきありがとうございますが、今のところ、何らかの理由で「ARRAYリファレンスとして未定義の値を使用できません」と言われました。何か忘れましたか? –

+0

ちょうど推測: 'rowcache'はある値に初期化されるべきですか? –

+2

@ mr.nothing '$ $ rowcache = [];'で行キャッシュを初期化してみてください。残念ながら、運がない。 – nwellnhof

関連する問題