Реализация чтения через потоки и вставки через потоки в MySQL - PullRequest
4 голосов
/ 01 апреля 2019

Я получил данные из таблицы tb_project_milestones и хочу вставить этот projectMilestoneRow в таблицу tb_xyz, используя потоки.Я проверил документацию , но не смог найти, как это реализовать.Кто-нибудь реализовал чтение через потоки и вставку через потоки в MySQL.

let insertProjectMilestones = [];
const getProjectMilestones = executeQueryStream.query('SELECT * FROM tb_project_milestones WHERE project_id = ? ');

getProjectMilestones
.on('error', function(err) {
  // Handle error, an 'end' event will be emitted after this as well
})
.on('result', function(projectMilestoneRow) {
  // Pausing the connnection is useful if your processing involves I/O
  connection.pause();

  processRow(projectMilestoneRow, function() {
    _.each(payload.projects, (project_id)=> {
      _.each(projectMilestoneRow, (el)=> {
        insertProjectMilestones.push([el.project_milestone_id, el.name, el.prefix, el.short_name, el.description, el.pre_requisites, project_id,
          el.milestone_template_id, el.generic_milestone_id, el.planned_date, el.actual_date, el.forecast_date,
          el.planned_date_only, el.forecast_date_only, el.actual_date_only, el.planned_time_only, el.forecast_time_only, el.actual_time_only,
          el.planned_date_formula, el.actual_date_formula, el.forecast_date_formula, el.planned_date_is_active, el.forecast_date_is_active,
          el.actual_date_is_active, el.creation_datetime, el.allow_notes, el.forecast_date_allow_notes, el.actual_date_allow_notes,
          el.planned_date_allow_notes, 0, el.requires_approval]);
      });
    });

    connection.resume();
  });
})
.on('end', function() {
  // all rows have been received
});

EDIT

Я использовал потоки в этом случае, потому что миллионы записей извлекаются из tb_project_milestones изатем вставляется в массив (после манипуляции), а затем помещается в другую таблицу.

Учитывая тот факт, что добавление этих многочисленных строк в массиве увеличит объем памяти узла, о котором я подумал, используя поток здесь.

Является ли поток лучшим выбором или я могу просто внедрить пакетную вставку в БД с использованием транзакций?

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

Не будет ли намного быстрее и проще выполнить один оператор SQL:

INSERT INTO insertProjectMilestones (...)
    SELECT ... FROM tb_project_milestones;

Таким образом, данные не передаются клиенту, а только передаются и передаются обратно на сервер.

И вы можете выполнять преобразования (выражения в SELECT) и / или фильтрацию (WHERE в SELECT) одновременно.

MySQL практически не ограничивает размер таблицы.

2 голосов
/ 01 апреля 2019

Для этого вы можете использовать knex stream и асинхронную итерацию (ES2018 / Node 10)

const knexClient = knex(someMysqlClientSettings);

const dbStream = knexClient("tb_project_milestones").where({ projectId }).stream();

for await (const row of dbStream){
    const processedRowObj = process(row);
    await knexClient("tb_xyz").insert(processedRowObj)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...