2012-04-24 41 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