Импортируйте огромный CSV-файл в MySQL, используя транзакцию - PullRequest
0 голосов
/ 29 марта 2020

Таким образом, идея состоит в том, чтобы сделать это, используя Node.JS, но любой другой язык программирования / платформа может помочь, поскольку программа должна быть простой.

Проблема:

Программа должна периодически загружать файлы CSV с FTP-сервера, которые необходимо импортировать в MySQL.

Проблемы:

  • Эти CSV-файлы иногда могут содержать миллионы строк, и нам нужно предотвратить исчерпание памяти.

  • Если импорт не удастся, должен произойти откат (SQL транзакция?).

  • Нам нужно изменить данные при импорте.

Я знаю о пакете NodeJS под названием «fast-csv», который реализует чтение потоки, чтобы предотвратить высокое использование памяти. Это потенциально может быть ответом. Проблема в том, что я не могу найти библиотеку, которая позволила бы мне импортировать данные в MySQL в виде потока и , используя транзакцию для отката.

Любые идеи о том, что использовать для этого случая? Как я уже сказал, это не обязательно должна быть NodeJS программа.

1 Ответ

0 голосов
/ 29 марта 2020

Вы должны использовать LOAD DATA в транзакции. Если ваша библиотека не имеет встроенной поддержки, посмотрите, можете ли вы просто выполнить запросы непосредственно к базе данных.

Что-то вроде:

START TRANSACTION;

LOAD DATA INFILE '/tmp/yourfile.csv' INTO TABLE yourtable
FIELDS TERMINATED BY ',';

UPDATE yourtable SET col1=col2*3;

COMMIT;

LOAD DATA сама по себе разрешает basi c манипуляции уже как часть нагрузки. При выполнении операторов просто проверьте, успешно ли они выполнены, и прервите с ROLLBACK в случае сбоя.

...