Como faço uma inserção em massa no mySQL usando node.js

Como se faria uma inserção em massa no mySQL se estivesse usando algo como https://github.com/felixge/node-mysql

Inserções em massa são possíveis usando matriz aninhada, veja a página do github

Arrays nesteds são transformados em listas agrupadas (para inserções em massa), por exemplo, [['a', 'b'], ['c', 'd']] transforma em ('a', 'b'), ('c', 'd')

Você acabou de inserir uma matriz aninhada de elementos.

Um exemplo é dado aqui

 var mysql = require('node-mysql'); var conn = mysql.createConnection({ ... }); var sql = "INSERT INTO Test (name, email, n) VALUES ?"; var values = [ ['demian', 'demian@gmail.com', 1], ['john', 'john@gmail.com', 2], ['mark', 'mark@gmail.com', 3], ['pete', 'pete@gmail.com', 4] ]; conn.query(sql, [values], function(err) { if (err) throw err; conn.end(); }); 

Observação: values é uma matriz de matrizes agrupadas em uma matriz

 [ [ [...], [...], [...] ] ] 

Eu não posso comentar ainda, então vou enviar uma resposta.

@ Ragnar123 resposta está correta, mas vejo muita gente nos comentários dizendo que não está funcionando. Eu tive o mesmo problema e parece que você precisa envolver sua matriz em []

assim

  var pars = [ [99, "1984-11-20", 1.1, 2.2, 200], [98, "1984-11-20", 1.1, 2.2, 200], [97, "1984-11-20", 1.1, 2.2, 200] ]; 

precisa ser passado como [pars] no método.

Espero que isto ajude.

Todos os adereços para Ragnar123 por sua resposta.

Eu só queria expandi-lo após a pergunta feita por Josh Harington para falar sobre IDs inseridos.

Estes serão sequenciais. Veja esta resposta: Uma inserção de múltiplas linhas do MySQL pega IDs sequenciais de incremento automático?

Portanto, você pode fazer isso (observe o que eu fiz com o result.insertId):

  var statement = 'INSERT INTO ?? (' + sKeys.join() + ') VALUES ?'; var insertStatement = [tableName, values]; var sql = db.connection.format(statement, insertStatement); db.connection.query(sql, function(err, result) { if (err) { return clb(err); } var rowIds = []; for (var i = result.insertId; i < result.insertId + result.affectedRows; i++) { rowIds.push(i); } for (var i in persistentObjects) { var persistentObject = persistentObjects[i]; persistentObject[persistentObject.idAttributeName()] = rowIds[i]; } clb(null, persistentObjects); }); 

(Eu puxei os valores de uma matriz de objects que chamei persistentObjects.)

Espero que isto ajude.

Caso seja necessário aqui, é como resolvemos inserir o array

pedido é do carteiro (você vai olhar para “convidados”)

  { "author_id" : 3, "name" : "World War II", "date" : "01 09 1939", "time" : "16 : 22", "location" : "39.9333635/32.8597419", "guests" : [2, 3, 1337, 1942, 1453] } 

E como nós escrevemos

 var express = require('express'); var utils = require('./custom_utils.js'); module.exports = function(database){ var router = express.Router(); router.post('/', function(req, res, next) { database.query('INSERT INTO activity (author_id, name, date, time, location) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE name = VALUES(name), date = VALUES(date), time = VALUES(time), location = VALUES(location)', [req.body.author_id, req.body.name, req.body.date, req.body.time, req.body.location], function(err, results, fields){ if(err){ console.log(err); res.json({ status: utils.respondMSG.DB_ERROR }); } else { var act_id = results.insertId; database.query('INSERT INTO act_guest (user_id, activity_id, status) VALUES ? ON DUPLICATE KEY UPDATE status = VALUES(status)', [Array.from(req.body.guests).map(function(g){ return [g, act_id, 0]; })], function(err, results, fields){ if(err){ console.log(err); res.json({ status: utils.respondMSG.DB_ERROR }); } else { res.json({ status: utils.respondMSG.SUCCEED, data: { activity_id : act_id } }); } }); } }); }); return router; }; 

Eu estava procurando uma resposta sobre a inserção de objects em massa.

A resposta de Ragnar123 me levou a fazer essa function:

 function bulkInsert(connection, table, objectArray, callback) { let keys = Object.keys(objectArray[0]); let values = objectArray.map( obj => keys.map( key => obj[key])); let sql = 'INSERT INTO ' + table + ' (' + keys.join(',') + ') VALUES ?'; connection.query(sql, [values], function (error, results, fields) { if (error) callback(error); callback(null, results); }); } bulkInsert(connection, 'my_table_of_objects', objectArray, (error, response) => { if (error) res.send(error); res.json(response); }); 

Espero que ajude!

Se a resposta do Ragnar não funcionar para você. Aqui está provavelmente o porquê (baseado na minha experiência) –

  1. Eu não estava usando o pacote node-mysql como mostrado no meu Ragnar . Eu estava usando o pacote mysql . Eles são diferentes (se você não percebeu – assim como eu). Mas não tenho certeza se tem alguma coisa a ver com o ? não funciona, já que parecia funcionar para muitas pessoas usando o pacote mysql .

  2. Tente usar uma variável em vez de ?

O seguinte funcionou para mim –

 var mysql = require('node-mysql'); var conn = mysql.createConnection({ ... }); var sql = "INSERT INTO Test (name, email, n) VALUES :params"; var values = [ ['demian', 'demian@gmail.com', 1], ['john', 'john@gmail.com', 2], ['mark', 'mark@gmail.com', 3], ['pete', 'pete@gmail.com', 4] ]; conn.query(sql, { params: values}, function(err) { if (err) throw err; conn.end(); }); 

Espero que isso ajude alguém.

Eu estava tendo problema semelhante. Foi apenas inserindo um da lista de matrizes. Funcionou depois de fazer as alterações abaixo.

  1. Passou [params] para o método de consulta.
  2. Alterou a consulta dos valores de insert (a, b) para table1 (?) ==> insert (a, b) em table1 values? . ie. Removida a parantesia ao redor do ponto de interrogação.

Espero que isto ajude. Eu estou usando o mysql npm.

Eu me deparei com isso hoje ( mysql 2.16.0) e pensei em compartilhar minha solução:

 const items = [ {name: 'alpha', description: 'describes alpha', value: 1}, ... ]; db.query( 'INSERT INTO my_table (name, description, value) VALUES ?', [items.map(item => [item.name, item.description, item.value])], (error, results) => {...} );