Я пытаюсь загрузить данные в базу данных 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;
Показать код для создания файла. – daxim
@ daxim: Конечно. Отредактировал вопрос. – mpe