如果使用像https://github.com/felixge/node-mysql这样的东西,如何批量插入mySQL ?
Rag*_*123 253
可以使用嵌套数组进行批量插入,请参阅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();
});
Run Code Online (Sandbox Code Playgroud)
注意:values是一个包含在数组中的数组数组
[ [ [...], [...], [...] ] ]
Run Code Online (Sandbox Code Playgroud)
小智 15
@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]
];
Run Code Online (Sandbox Code Playgroud)
它需要像[pars]方法一样传递.
Ste*_*son 11
我正在寻找批量插入对象的答案.
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);
});
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你!
这是一个快速的“原始复制粘贴”,用于在 mysql 中使用 node.js >= 11 推送文件列
几秒钟内250k行
'use strict';
const mysql = require('promise-mysql');
const fs = require('fs');
const readline = require('readline');
async function run() {
const connection = await mysql.createConnection({
host: '1.2.3.4',
port: 3306,
user: 'my-user',
password: 'my-psw',
database: 'my-db',
});
const rl = readline.createInterface({ input: fs.createReadStream('myfile.txt') });
let total = 0;
let buff = [];
for await (const line of rl) {
buff.push([line]);
total++;
if (buff.length % 2000 === 0) {
await connection.query('INSERT INTO Phone (Number) VALUES ?', [buff]);
console.log(total);
buff = [];
}
}
if (buff.length > 0) {
await connection.query('INSERT INTO Phone (Number) VALUES ?', [buff]);
console.log(total);
}
console.log('end');
connection.close();
}
run().catch(console.log);
Run Code Online (Sandbox Code Playgroud)
小智 8
我今天遇到了这个问题(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) => {...}
);
Run Code Online (Sandbox Code Playgroud)
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);
});
Run Code Online (Sandbox Code Playgroud)
(我从一个名为persistentObjects的对象数组中提取了值.)
希望这可以帮助.
如果Ragnar的答案对您不起作用。这可能是原因(根据我的经验)-
我没有使用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', '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();
});
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助某人。