Могу ли я использовать LOAD DATA INFILE, чтобы вставить все данные файла в один столбец? - PullRequest
0 голосов
/ 04 марта 2020

Мы храним файлы отчетов в таблице базы данных mysql. Наша текущая реализация выглядит примерно так:

// File was generated and placed on the disk, now we're going
// to store it in the database
$file = file_get_contents($path);

$report->csv_data = $file;
$report->save(); // UPDATE reports SET csv_data = ... WHERE id = ?

Что ж, это приводит к ошибкам из-за нехватки памяти при больших отчетах в несколько сотен мегабайт. Я пытался использовать PDO :: PARAM_LOB, но это не работает, он загружает весь файл в память.

Так что я пытался использовать mysql LOAD DATA INFILE для вставки файла, но это обычно используется для анализа и массового импорта данных. Я не хочу анализировать данные отчета, мне просто нужно, чтобы все содержимое файла было помещено в один столбец в одной строке таблицы. Это то, с чем я возился:

LOAD DATA INFILE '/web/reportTest.csv'
INTO TABLE report.reports
FIELDS TERMINATED BY '?'
LINES TERMINATED BY '?'
(csv_data)

Я пытаюсь установить разделители для некоторого символа, который никогда не будет в результирующем наборе, и только заполнить столбец csv_data, который вроде работает, но кажется хакерским и запускает автоинкремент с ошибкой строк. Я просто не могу найти других примеров того, как люди делают это, поэтому любая помощь будет принята с благодарностью. Кроме того, если кто-то знает о лучшем способе выполнения sh этого, я весь слух.

РЕДАКТИРОВАТЬ: Моя таблица выглядит следующим образом:

CREATE TABLE `report` (
    `id` INT(10) NOT NULL,
    `date` INT(10) NOT NULL,
    `uindex` INT(11) NOT NULL,
    `csv_filename` VARCHAR(255) NULL DEFAULT NULL COLLATE 'latin1_general_ci',
    `csv_data` LONGTEXT NULL DEFAULT NULL COLLATE 'latin1_general_ci',
    `delivery_schedule` TINYINT(2) NOT NULL,
    `saved_id` INT(11) NOT NULL,
    PRIMARY KEY (`id`) USING BTREE,
    INDEX `saved_id` (`saved_id`) USING BTREE,
    INDEX `date_idx` (`date`) USING BTREE
)
COLLATE='latin1_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=678526
;
...