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)

  • Victorio Berra,这是因为最外面的数组是声明中一个匹配的问号,而不仅仅是插入.例如,如果您有两个问号占位符,那么您将拥有[param1,param2].说"UPDATE Users?WHERE ID =?",[columns,ID]因此,列将扩展为第一个问号,ID将扩展到第二个问号. (12认同)
  • 这对我来说很困惑.为什么数组必须是[[['a','b'],['c','d']]]而不是[['a','b'],['c','d ']]就像文件说的那样? (6认同)
  • 不幸的是,这个答案对我不起作用.我确实复制了你的答案但没有成功.我在/sf/ask/2881959461/上发布了另一个问题 (3认同)
  • 这是否提供与使用`conn.execute()`来使用预准备语句相同的保护?如果没有,是否可以在插入时使用预处理语句?谢谢. (2认同)
  • 是的,使用此方法对值进行了转义。我认为它与准备好的语句是相同的机制,它也在内部使用 connection.escape()。 (2认同)

小智 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]方法一样传递.

  • 是的,由于某种原因,它需要是一个阵列数组... (4认同)

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)

希望能帮助到你!


Man*_*lon 9

这是一个快速的“原始复制粘贴”,用于在 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)

  • 这效果非常好,谢谢!适配器注意事项:即使 INSERT 中有多个列,关键是在“VALUES”后面保留这个单个“?”,不带任何括号。这样,可以在批量插入中自动处理列数组的数组。用它来分析M​​ySQL中数百兆的访问日志。 (2认同)

小智 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)

  • 我喜欢你的解决方案 (3认同)

the*_*ror 6

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的对象数组中提取了值.)

希望这可以帮助.


Asw*_*nan 5

如果Ragnar的答案对您不起作用。这可能是原因(根据我的经验)-

  1. 我没有使用node-mysql我的Ragnar. 我正在使用mysql包。他们是不同的(如果你没有注意到 - 就像我一样)。但我不确定它是否与?不工作有关,因为它似乎对许多使用该mysql软件包的人都有效。

  2. 尝试使用变量而不是 ?

以下对我有用-

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)

希望这可以帮助某人。