我正在尝试使用该LOAD DATA LOCAL INFILE
语句将数据加载到 MySQL 数据库中。在普通文件上,这工作正常。
如果我创建一个临时文件File::Temp
,将 CSV 数据存储在其中,关闭文件,然后LOAD
使用
$dbh->do("LOAD DATA LOCAL INFILE '$tempfile' INTO TABLE $temptable" FIELDS TERMINATED BY ',');
最后两条记录可重复地省略。但是,如果我在创建和LOAD
ing 之间对临时文件执行任何操作,例如使用
`touch $tempfile`;
一切都按预期工作。
这是 MySQL 驱动程序在新创建的临时文件时遇到问题的问题吗?它是文件系统(ext4)问题,也许缓存刷新没有及时发生?我在这里错过了什么吗?
编辑:实际上,如果临时 CSV 文件不是由格式转换器子例程创建的,而是手动创建的,则所有记录都将被省略,如下所示。我还包括了数据库交互的代码。请注意 commented 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;