Потоковая выгрузка из Postgres в CSV на Node.js и Fastify

habrahabr.ru · world
Full story

Exporting a database table to a file is a very common task, and while a table holds few records, CSV export is usually written in just a few lines: run a query, get an array, turn it into text and send it to the client. At hundreds of thousands of rows, that approach starts using too much memory. The entire query result ends up in Node.js at once, and building the CSV on top of it adds further overhead. The article looks at streaming the export instead, using Node.js with Fastify and Postgres.

Потоковая выгрузка из базы данных в CSV Экспорт таблицы в файл - очень типовая задача. Пока записей немного, экспорт CSV обычно пишут в несколько строк: выполнить запрос, получить массив, превратить его в текст и отправить клиенту. На сотнях тысяч строк этот подход начинает расходовать слишком много памяти. Результат запроса целиком оказывается в Node.js, а при сборке CSV появляются дополнительные строки и буферы. Несколько одновременных выгрузок могут довести процесс до OOM. Разберём реализацию на Node.js, Fastify, Knex и PostgreSQL. CSV будем генерировать порциями, сохраняя сортировку списка ( createdAt DESC ). Если в вашем кейсе другая сортировка - достаточно поменять на нужную. Отдельно придётся решить вопрос с авторизацией ссылки на скачивание. Читать далее

Read full article → Compare