Skip to content

Instantly share code, notes, and snippets.

@reinaldorauch
Created February 16, 2018 17:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save reinaldorauch/be89495385ccaf25d83024041911acc0 to your computer and use it in GitHub Desktop.
Save reinaldorauch/be89495385ccaf25d83024041911acc0 to your computer and use it in GitHub Desktop.
const Promise = require('bluebird'); // usado para rodar o map em sequência para não sobrecarregar o db
/**
* Converte a chamada da conexão para realizar query para usar promise
*/
function mysqlQuery(conn, sql, params) {
return new Promise((resolve, reject) => {
conn.query(sql, params, (err, result) => {
if (err) return reject(err);
resolve(result);
});
});
}
/**
* Agrupa um array em um array de arrays com 200 elementos
*/
function groupInto200(groups, itemToGroup) {
const lastGroup = groups[groups.length - 1]; // último grupo criado
if (Array.isArray(lastGroup) && lastGroup.length <= 200) {
lastGroup.push(itemToGroup); // adicionando no grupo enquanto tiver menos de 200 elementos
} else if (Array.isArray(lastGroup)) {
groups.push([itemToGroup]); // criando novo grupo quando há mais de 200 elementos
}
return groups; // retornando o array de grupos para continuar o reduce
}
/**
* Função para decompor o objeto recebido e convertê-lo para a sintaxe
* esperada pelo driver do mysql para gerar a query de insersão múltipla
*/
function mapObjectIntoArray ({fielda, fieldb, fieldc}) {
return [fielda, fieldb, fieldc];
}
/**
* Insere no banco um array de elementos tipo
* INSERT INTO table (fielda, fieldb, fieldc) VALUES
* ('valueForFielda', 'valueForFieldb', 'valueForFieldc'),
* ('valueForFielda', 'valueForFieldb', 'valueForFieldc'),
* ('valueForFielda', 'valueForFieldb', 'valueForFieldc'),
* ...
* ('valueForFielda', 'valueForFieldb', 'valueForFieldc');
*/
function bulkInsert(conn, data) {
const sql = 'INSERT INTO table (fielda, fieldb, fieldc) VALUES ?';
return mysqlQuery(sql, data.map(mapObjectIntoArray));
}
function importer(largeArrayToConsume) {
return largeArrayToConsume
.reduce(groupInto200, [])
.mapSeries(bulkInsert);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment