2012-04-24 3 views
2

Я пытаюсь загрузить данные в базу данных MySQL, используя оператор LOAD DATA LOCAL INFILE. В обычных файлах это работает нормально.DBI :: mysql и File :: Temp

Если я создаю временный файл с File::Temp, хранить данные CSV в нем, закройте файл, а затем непосредственно LOAD его в базу данных, используя

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

последние две записи воспроизводимо опущена. Однако, если я что-нибудь с TempFile между созданием и LOAD ющиеся, например, с

`touch $tempfile`; 

все работает, как ожидалось.

Это проблема с драйвером MySQL, который имеет проблемы со свежевыработанными tempfiles? Является ли это проблемой файловой системы (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

Смежные вопросы