Как сделать массовую вставку в mySQL с помощью узла.js
Как бы сделать массовую вставку в mySQL, если использовать что-то вроде
https://github.com/felixge/node-mysql
8 ответов:
массовые вставки возможны с помощью вложенного массива, см. страница 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', '[email protected]', 1], ['john', '[email protected]', 2], ['mark', '[email protected]', 3], ['pete', '[email protected]', 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 за его ответ.
Я просто хотел расширить его после вопроса, заданного Джошем Харингтоном, чтобы поговорить о вставленных идентификаторах.
они будут последовательными. Смотрите этот ответ:делает ли Многорядная вставка MySQL захватывать последовательные идентификаторы автоинкремента?
следовательно, вы можете просто сделать это (обратите внимание, что я сделал с результатом.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.)
надеюсь, что это помогает.
в случае, если это необходимо, вот как мы решили вставить массив
запрос от почтальона (вы будете смотреть на "гостей" )
{ "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 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); });надеюсь, что это помогает!
если
Ragnar' s ответ не работает для вас. Вот, наверное, почему (исходя из моего опыта) -
Я не использовал
node-mysqlпакет, как показано мойRagnar. Я использовалmysqlпакета. Они разные (если вы не заметили - совсем как я). Но я не уверен, что это имеет какое-то отношение к?не работает, так как он, казалось, работал для многих людей, использующихmysqlпакета.попробуйте использовать переменную вместо
?следующее работало для меня -
var mysql = require('node-mysql'); var conn = mysql.createConnection({ ... }); var sql = "INSERT INTO Test (name, email, n) VALUES :params"; var values = [ ['demian', '[email protected]', 1], ['john', '[email protected]', 2], ['mark', '[email protected]', 3], ['pete', '[email protected]', 4] ]; conn.query(sql, { params: values}, function(err) { if (err) throw err; conn.end(); });надеюсь, это кому-то поможет.
я столкнулся с этим сегодня ( mysql 2.16.0) и подумал, что я поделюсь своим решением:
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) => {...} );
У меня была похожая проблема. Это была просто вставка одного из списка массивов. Он работал после внесения следующих изменений.
- передано [params] в метод запроса.
- изменил запрос из insert (a, b) В значения table1 (?) = = > вставить (a, b) В значения таблицы 1 ? . то есть. Убрал парантез вокруг вопросительного знака.
надеюсь, что это помогает. Я использую mysql npm.
Comments