javascript - Node.js 循环数据库插入

标签 javascript mysql node.js promise

我有一个应用程序,其中包含一个地址对象以及与该应用程序关联的人员列表。

{
  field1: value,
  field2: value,
  address: {
    street: value,
    apt: value,
    city: value
  },
  owners: [
    {name: value, etc.},
    {name: value, etc.}
  ]
}

我将所有者传递给一个函数,该函数循环所有者并将每个查询的信息传递给异步函数:

async function insertAllOwners(appId, owners) {
  for (var i = 0, len = owners.length; i < len; i++) {
    console.log("insert owner", i);
    await insertOwner(appId, owners[i]);
  }
}

此处调用的函数将查询转变为 promise :

function insertOwner(appId, owner)  {
  let sqlOwner = 'insert into ...';
  return new Promise( ( resolve, reject ) => {
    mySqlClient.query(sqlOwner, [appId, owner.memberType ...], (err, rows) => {
      if ( err )
        return reject( err );
      console.log("rows:", rows);
      resolve( rows );
    } );
  } );
}

地址插入嵌套在应用程序插入内部,然后调用所有者插入循环的代码嵌套在地址插入内部。循环所有者插入函数在这里调用:

      if(app.owners) {
        /* insert owners, then commit.  else, just commit.*/
        insertAllOwners(appId, app.owners).then( result => {
          mySqlClient.commit(function(err, result) {
            if (err) { 
              console.error("ERROR DURING COMMIT:", err);
              mySqlClient.rollback(function() {
                throw err;
              });
            }
            else {
              console.log("commit:",result);
            }
          });                  
        });
      }

输出看起来很完美,但它似乎没有实际提交任何内容(新行没有显示)。有什么建议么?日志输出如下:

OkPacket {
  fieldCount: 0,
  affectedRows: 1,
  insertId: 0,
  serverStatus: 1,
  warningCount: 1,
  message: '',
  protocol41: true,
  changedRows: 0
}

address result:
OkPacket {
  fieldCount: 0,
  affectedRows: 1,
  insertId: 35,
  serverStatus: 1,
  warningCount: 0,
  message: '',
  protocol41: true,
  changedRows: 0
}

insert owner 0
rows:
OkPacket {
  fieldCount: 0,
  affectedRows: 1,
  insertId: 70,
  serverStatus: 1,
  warningCount: 0,
  message: '',
  protocol41: true,
  changedRows: 0
}

...

insert owner 4
rows:
OkPacket {
  fieldCount: 0,
  affectedRows: 1,
  insertId: 74,
  serverStatus: 1,
  warningCount: 0,
  message: '',
  protocol41: true,
  changedRows: 0
}

commit:
OkPacket {
  fieldCount: 0,
  affectedRows: 0,
  insertId: 0,
  serverStatus: 0,
  warningCount: 0,
  message: '',
  protocol41: true,
  changedRows: 0
}

最佳答案

首先,这不是执行查询的好习惯。

您正在做什么来运行 for 循环,并且每个循环执行每个查询。这样你就可以给 mysql 带来负载。而且执行 API 需要更长的时间。

我建议这样。

在 for 循环中:

for (var i = 0, len = owners.length; i < len; i++) {
   inserData.push(owners[i]); // Add all data in to array ... 
}

之后,对所有数据执行查询一次。

connection.query("INSERT INTO TABLE (columns) VLAUES ? " , insertData)... 

关于javascript - Node.js 循环数据库插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53034223/

相关文章:

node.js - 拦截IBM的Watson Botkit中间件进行测试

Javascript 时间戳无效

javascript - jQuery 扩展菜单

javascript - 在单个页面上使用多个(猫头鹰)轮播

javascript - typescript :合并/覆盖嵌套接口(interface)

mysql - 如何优化这个依赖日期值的 JOIN 查询?

c# - 如何使用 FormsAuthentication 和 MySQL 制作一个简单的登录表单?

php - 如何使用页面弹出窗口在Mysql数据库中插入数据而不重新加载页面?

node.js - 如何对20亿个IP地址实现IP过滤?

javascript - 发布请求时 Object.assign 进行复制