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;
ファイルを作成するためのコードを表示します。 – daxim
@ダキシム:はい。質問を編集しました。 – mpe