数据库
首页 > 数据库> > Node JS使用事务时将对象数组插入mysql数据库

Node JS使用事务时将对象数组插入mysql数据库

作者:互联网

我使用node-mysql将记录添加到数据库,但是当要插入的记录是一个对象数组并且我需要将操作作为事务时,我正面临挑战.我通过创建一个测试项目来简化我的问题,以更好地解释我的问题.

让我们说我必须表用户和订单,并且要插入的数据看起来像这样

var user = {
   name: "Dennis Wanyonyi",
   email: "example@email.com"
};

var orders = [{
   order_date: new Date(),
   price: 14.99
}, {
   order_date: new Date(),
   price: 39.99
}];

我想先将用户插入数据库,然后使用insertId为该用户添加每个订单.我正在使用一个事务,因为如果出现错误,我想回滚整个过程.以下是我尝试使用node-mysql transactions插入所有记录的方法.

connection.beginTransaction(function(err) {
  if (err) { throw err; }
  connection.query('INSERT INTO users SET ?', user, function(err, result) {
    if (err) {
      return connection.rollback(function() {
        throw err;
      });
    }


    for (var i = 0; i < orders.length; i++) {

      orders[i].user_id = result.insertId;

        connection.query('INSERT INTO orders SET ?', orders[i], function(err, result2) {
          if (err) {
            return connection.rollback(function() {
              throw err;
            });
          }  
          connection.commit(function(err) {
            if (err) {
              return connection.rollback(function() {
                throw err;
              });
            }
            console.log('success!');
          });
        });
       }
      });
     });

但是我在迭代订单数组时遇到问题,而不必在for循环中多次调用connection.commit

最佳答案:

我建议首先在for循环中为orders表的多行插入查询构造一个简单的字符串,然后在for循环之外执行它.使用for循环仅构造字符串.因此,您可以随时或在出错时回滚查询.通过多个插入查询字符串,我的意思如下:

INSERT INTO your_table_name
    (column1,column2,column3)
VALUES
    (1,2,3),
    (4,5,6),
    (7,8,9);

标签:mysql,node-js,transactions,node-mysql
来源: https://codeday.me/bug/20190516/1114849.html