将批量数据添加到mysql数据库

时间:2019-01-15 20:06:47

标签: mysql node.js

我有一个控制台程序,用户在其中扫描序列号,然后将这些序列号添加到数据库中。

{
  "name": "hi",
  "details": {
    "credits": 10
  }
}

代码运行时,它成功连接到数据库,但查询数据库。它不断提示用户输入。

或者,我尝试将序列号存储在数组中,然后像这样循环遍历它添加每个元素。

const mysql = require('mysql2');
const read = require('readline-sync');

const conn = new mysql.createConnection(config);

conn.connect(
function(err){
    if(err){
        throw err;
    }
    else{
        console.log("Connection Established");
        while(1){
            var sn = read.question('Scan in serial number: ');
            conn.query('INSERT INTO test (serial) VALUES (?);',
            [sn], function(err, results, fields){
                if (err){
                    throw err;
                }
                else{
                    console.log("Added stuff");
                }
            });
        }
    }
}
);

在这种情况下,它的工作不一致。有时它可以正常工作,而有时它却无法连接并引发超时错误。有没有更好的方法可以做到这一点和/或我做错了什么?

2 个答案:

答案 0 :(得分:1)

var promises = []
function dbOp(value) {
  return new Promise(function(resolve, reject) {
      conn.query('INSERT INTO test (serial) VALUES (?);',
                [value], function (err, results, fields) {
                    if (err) {
                        return reject(err)
                    }
                    else {
                        console.log("Added stuff"); 
                        resolve(results)
                    }
  }
}




conn.connect(function(err){
    if(err){
        throw err;
    }
    else{
        for (i = 0; i < array.length; ++i) {
            promises.push(dbOp(array[i]));
        }
    }
});

  Promise.all(promises)
      .then((results) => {
        console.log("done", results);
      })
      .catch((e) => {
          console.log(e)
      });

答案 1 :(得分:0)

这可能是由于mysql服务器中的空闲超时时间设置过短引起的。 client.connect()在mysql2中几乎是无操作的,当您调用mysql.createConnection()时它会立即连接。您只有在收集完所有数据后才能更改顺序以建立连接:

const mysql = require('mysql2');
const read = require('readline-sync');

var array = [];
var sn = ' ';
while (1) {
  sn = read.question('Scan in serial number, or enter "done" if finished scanning');
  if (sn == 'done') {
    const conn = mysql.createConnection(config);
    array.forEach(function(sn) {
      conn.query('INSERT INTO test (serial) VALUES (?);', [sn], function(err, results, fields) {
        if (err) {
          throw err;
        } else {
          console.log('Added stuff');
        }
      });
    });
  }
  array.push(sn);
}