使用节点JavaScript将批量数据插入MySQL

时间:2015-12-01 11:24:00

标签: mysql node.js node-mysql

我正在尝试从SQL服务器获取数据并插入MySQL。我已经获得了大约1个lac的记录。记录的获取是正确完成的,但在将记录插入MySQL期间,它不会立即插入数据。我需要刷新MySQL以查看新记录。

var sql       = require('mssql');
var mysql     = require("mysql");

var config = {
    user     : 'sa', 
    password : '******',
    server   : 'serverurl', 
    database : 'DB',
    stream   : true //work with large amount of rows
};

var connection1 = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : 'root',
    database : 'test'
});

connection1.connect();

var connection = new sql.Connection(config, function(err) {

    if(err)
        console.log(err);

    var request = new sql.Request(connection);
    // request.stream = true; // You can set streaming differently for each request 

    request.query('select TOP 100000 * FROM ShipmentAuditLog WITH (NOLOCK)'); // or request.execute(procedure); 


    request.on('recordset',function(col){
        console.time('Time-Taken');
    });

    // Emitted for each row 
    request.on('row', function(row) {

        syncing(row);
        // console.log('Row Inserted');

    });

    request.on('error', function(err) {
        console.log(err);
    });

    // Emitted for the last one
    request.on('done', function(returnValue) {
        console.timeEnd('Time-Taken');
        connection.close();
    });
});

var syncing = function(row){
    connection1.query('INSERT INTO shipmentauditlog SET ?', row, function(err,res) {

        if(err)
            console.log(err);
        // else
            // console.log('Added');

     });
 };

1 个答案:

答案 0 :(得分:0)

我试图在尝试将数千条假记录插入MySQL数据库时重新创建相同的效果。这显然会使日志超载(因为符合ACID),因此您有两种选择 - 在插入期间放松ACID合规性(请参阅this answer),尽管这通常是一个非常糟糕的想法,或者更好的解决方案,是使用NodeJS批量插入记录而不是逐个插入记录。

我建议你根据记录的大小,一次读取20或30个,并构建一个多插入来将数据添加到MySQL。请参阅this link for the MySQL documentation

所以你最终会做这样的事情:

'INSERT INTO shipmentauditlog VALUES (1,2,3), (1,2,3), (1,1,1), (1,1,3);'

另一种选择,如果这是一次大规模的一次性操作,就是使用NodeJS读取所有记录并创建包含所有数据的TXT文档。 MySQL非常支持批量加载大量数据。这会快得多,因为MySQL会批量读取文件中的数据并随着它的推移插入它。如果我不得不加载大量数据,那将是我的首选。有关详细信息,请参阅MySQL Documentation

一个简单的例子是:

LOAD DATA INFILE 'mydata.txt' INTO TABLE shipmentauditlog 
FIELDS TERMINATED BY ',';