如何使用node.js在mySQL中进行批量插入
如果使用类似https://github.com/felixge/node-mysql的话,如何批量插入mySQL
批量插入可以通过使用嵌套数组,请参阅github页面
嵌套数组变成分组列表(用于批量插入),例如
[['a', 'b'], ['c', 'd']]
变成('a', 'b'), ('c', 'd')
您只需插入一个嵌套的元素数组。
这里给出一个例子
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(); });
注意: values
是一个包装在数组中的数组的数组
[ [ [...], [...], [...] ] ]
我无法评论,所以会提交答案。
@ Ragnar123答案是正确的,但我看到很多人在评论说,这是行不通的。 我有同样的问题,似乎你需要包装你的数组[]
所以
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] ];
需要像[pars]
一样传递给方法。
希望这可以帮助。
所有道具Ragnar123的答案。
我只是想在Josh Harington提出的关于插入ID的问题之后再扩展它。
这些将是连续的。 看到这个答案: 一个MySQL多行插入抓取顺序自动增量ID?
因此,你可以做到这一点(注意我做了什么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); });
(我从我称为persistentObjects的对象数组中取出值。)
希望这可以帮助。
如果Ragnar
的回答不适合你。 这可能是为什么(根据我的经验) –
-
我没有使用
node-mysql
包,如我的Ragnar
所示。 我正在使用mysql
包。 他们是不同的(如果你没有注意到 – 就像我一样)。 但是我不确定它与这个有什么关系?
不工作,因为它似乎为许多使用mysql
包的人工作。 -
尝试使用一个variables,而不是
?
以下为我工作 –
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(); });
希望这有助于某人。
如果这里需要的是我们如何解决插入数组
要求是邮差(你会看“客人”)
{ "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] }
以及我们如何编写的
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; };
我正在四处寻找批量插入对象的答案。
Ragnar123的回答让我有这个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); });
希望它有帮助!