2012-04-24 10 views
2

LOAD DATA LOCAL INFILEステートメントを使用してMySQLデータベースにデータをロードしようとしています。通常のファイルでは、これは正常に動作します。最後の二つのレコードが再現性よく省略されているDBI :: mysqlとFile :: Temp

$dbh->do("LOAD DATA LOCAL INFILE '$tempfile' INTO TABLE $temptable" FIELDS TERMINATED BY ','); 

を使用してデータベースへのその後

私はFile::Tempと一時ファイルを作成する場合、その中に保存したCSVデータ、ファイルを閉じて、直接LOADそれが。しかし、私はすべてが期待どおりに動作します

`touch $tempfile`; 

と、たとえば、作成とLOAD INGの間で一時ファイルとは何をすれば。

これは、新しく作成された一時ファイルに問題があるMySQLドライバの問題ですか?それはファイルシステム(ext4)の問題ですか、おそらく時間内に起こっていないキャッシュフラッシュですか?私はここに何かを逃していますか

EDIT:一時CSVファイルはフォーマットコンバータサブルーチンによって作成されていない場合は実際に、すべてレコードが省略されているが、手で下記のように。私はデータベースのやりとりのためのコードも含めました。コメントを付けたtouch $tmpfhに注意してください。これは、コメントを外したときに、この例を動作させるでしょう。

UNLINK => 0からFile::Temp->new()を追加しても差はありません。

my $tmpfh = File::Temp->new(); 
print $tmpfh <<EOT; 
record1,textfield1 
record2,textfield2 
record3,textfield3 
record4,textfield4 
record5,textfield5 
EOT 

# `touch $tmpfh`; # uncomment this line to make it work 

# get db handle 
my $dbh = DBI->connect("DBI:mysql:$dbname:$dbserver", $username, $pwd); 

# drop and recreate temp table 
$dbh->do("DROP TABLE IF EXISTS $temptable") or die; 
$dbh->do("CREATE TABLE $temptable (
`id`  INT(11)  NOT NULL PRIMARY KEY AUTO_INCREMENT, 
`header` VARCHAR(255) NOT NULL, 
`sequence` MEDIUMBLOB)") 
    or die; 

# load data into temp table 
my $nrecords = $dbh->do("LOAD DATA LOCAL INFILE '$tmpfh' 
INTO TABLE $temptable 
FIELDS TERMINATED BY ',' 
(header, sequence)") 
    or die; 

$dbh->disconnect(); 

printf "Loaded %d records from %s into %s on %s.\n", $nrecords, $tmpfh, $dbname, $dbserver; 
+0

ファイルを作成するためのコードを表示します。 – daxim

+0

@ダキシム:はい。質問を編集しました。 – mpe

答えて

3

バッファをフラッシュするためにファイルハンドルを閉じます。オブジェクトが有効範囲外になったときにファイルを残したい場合は、 "UNLINK => 0"のままにしてください。

+0

私はそれを忘れました。ありがとうございました! – mpe

関連する問題