8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何使用 node.js 在 mySQL 中进行批量插入

SNS 2月前

44 0

如果使用类似https://github.com/felixge/node-mysql之类的东西,如何批量插入到mySQL中

之类的东西,如何批量插入到mySQL中 https://github.com/felixge/node-mysql

帖子版权声明 1、本帖标题:如何使用 node.js 在 mySQL 中进行批量插入
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由SNS在本站《mysql》版块原创发布, 转载请注明出处!
最新回复 (0)
  • jlx 2月前 0 只看Ta
    引用 2

    你的问题是什么?你能用与一个 SQL 命令相同的方式完成吗?只需在上一个命令完成后启动下一个命令,直到插入所有数据。

  • 可以使用嵌套数组进行批量插入,请参阅 github 页面

    嵌套数组变成分组列表(用于批量插入),例如 [['a', 'b'], ['c', 'd']] 变成 ('a', 'b'), ('c', 'd')

    您只需插入一个嵌套的元素数组。

    这里 给出了一个例子

    var mysql = require('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 是包裹在数组中的数组

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

    还有一个完全不同的 node-msql 包用于批量插入

  • 这是否提供了与执行 conn.execute() 以使用准备好的语句相同的保护?如果没有,在执行插入时是否可以使用准备好的语句?谢谢。

  • 是的,使用此方法可以转义值。我认为这与准备好的语句的机制相同,后者也在内部使用 connection.escape()。

  • 这让我很困惑。为什么数组必须是 [[['a', 'b'], ['c', 'd']]] 而不是文档中说的 [['a', 'b'], ['c', 'd']]?

  • Victorio Berra,这是因为最外层数组是与语句中的问号匹配的数组,而不仅仅是在插入时。例如,如果您有两个问号占位符,那么您将有 [param1,param2]。例如 \'UPDATE Users ? WHERE ID=?\',[columns,ID] 因此,列将扩展到第一个问号,ID 扩展到第二个问号。

  • 不幸的是,这个答案对我不起作用。我直接复制了你的答案,但没有成功。我在 .com/questions/41170849/… 上发布了另一个问题

  • 我今天遇到了这个问题( 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) => {...}
    );
    
  • 这个解决方案对我有用!谢谢!邮递员:[{\'textQuestionBuilderID\':\'5\',\'candidateID\':\'ABC123\',\'resultSelected\':\'sfgh\'},{\'textQuestionBuilderID\':\'6\',\'candidateID\':\'ABC123\',\'resultSelected\':\'sfgh\'},{\'textQuestionBuilderID\':\'7\',\'candidateID\':\'ABC123\',\'resultSelected\':\'sfgh\'},{\'textQuestionBuilderID\':\'8\',\'candidateID\':\'ABC123\',\'resultSelected\':\'sfgh\'} ]

  • 你好!我也在使用 mysql2 并尝试进行批量插入,但它抛出了 500。.com/questions/67672322/… <- 这是我的错误,有什么与你的答案不同吗?谢谢

  • @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 的回答让我制作了这个功能:

    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);
    });
    

    希望有帮助!

  • 引用 14

    非常感谢 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 的对象数组中提取了值。)

    希望这有帮助。

  • 请注意,这仅当 auto_increment 步长为其原始值 1 时才会起作用。请参阅 dev.mysql.com/doc/refman/5.7/en/…

  • SPao 2月前 0 只看Ta
    引用 16

    这是一个快速的 \'raw-copy-paste\' 片段,用于在 node.js >= 11 的 mysql 中推送文件列

    几秒钟内完成 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);
    
  • 这效果非常好,谢谢!适配器注意事项:即使 INSERT 中有多个列,关键是要将这个 ? 保留在 VALUES 后面,不带任何括号。这样,可以在批量插入中自动处理列数组的数组。使用它来分析 MySQL 中数百兆字节的访问日志。

  • 直到我尝试不这样做时,我才明白为什么要将其拆分成块。在某个时候,我的插入太大,服务器无法及时处理,我得到了 EPIPE 错误。将插入拆分成块可以解决这个问题。:)

  • 如果 Ragnar 答案不适合您。这可能是原因(根据我的经验) -

    1. p1

    2. p2

    以下对我有用-

    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();
    });
    

    希望这对某人有帮助。

  • 我认为你可能忘记将 [] 放在 values 中。我也遇到过这种情况。应该是:conn.query(sql, [values], function(){}) 而不是:conn.query(sql, values, function(){}) 尽管 values 变量是一个数组,但我们仍然必须用 [] 包裹它

返回
作者最近主题: