2012-04-24 4 views
2

LOAD DATA LOCAL INFILE 문을 사용하여 MySQL 데이터베이스에 데이터를로드하려고합니다. 정상적인 파일에서는 정상적으로 작동합니다. 나는 그것에 File::Temp 저장 CSV 데이터와 임시 파일을 만드는 경우DBI :: mysql 및 File :: Temp

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

마지막 두 개의 레코드가 재현 생략을 사용하여 데이터베이스에 다음 직접 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

@ daxim : 예. 질문을 수정했습니다. – mpe

답변

3

버퍼를 플러시하려면 파일 핸들을 닫습니다. 개체가 범위를 벗어날 때 파일을 유지하려면 "UNLINK => 0"을 유지하십시오.

+0

나는 그것을 잊었다. 고맙습니다! – mpe

관련 문제