2012-04-24 65 views
2

我试图使用LOAD DATA LOCAL INFILE语句将数据加载到MySQL数据库中。在普通文件上,这工作正常。DBI :: mysql和File :: Temp

如果我创建File::Temp,在IT卖场CSV数据的临时文件,直接LOAD它关闭该文件,然后使用到

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

最后两个记录重复地省略了数据库。但是,如果我做的创建和LOAD ING,例如之间的临时文件任何与

`touch $tempfile`; 

一切按预期工作。

这是MySQL驱动程序遇到新创建的临时文件时遇到的问题吗?它是一个文件系统(ext4)的问题,也许缓存刷新不及时发生?我在这里错过了什么吗?

编辑:其实,如果不是由格式转换子程序创建的临时CSV文件所有记录被省略,但通过手,如下图所示。我还包含了数据库交互的代码。请注意注释touch $tmpfh,如果未注释,它将使示例正常工作。

添加UNLINK => 0File::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 2012-04-24 10:32:13

+0

@daxim:当然。编辑了这个问题。 – mpe 2012-04-24 12:52:24

回答

3

关闭文件句柄刷新缓冲区。如果您希望文件在对象超出范围时保持不变,请保留“UNLINK => 0”。

+0

我忘了这么做。谢谢! – mpe 2012-04-25 12:31:44