【问题标题】:node.js looping database insertsnode.js 循环数据库插入
【发布时间】:2018-10-29 02:36:42
【问题描述】:

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

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

这里调用的函数将查询变成了一个承诺:

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
}

【问题讨论】:

    标签: javascript mysql node.js promise


    【解决方案1】:

    第一件事是,这不是执行查询的好习惯。

    你正在做什么来运行一个 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)... 
    

    【讨论】:

    • 这种方式对解决你的问题有帮助吗?
    猜你喜欢
    • 1970-01-01
    • 2021-07-20
    • 2015-12-22
    • 1970-01-01
    • 2019-10-18
    • 2018-10-02
    • 2020-05-13
    • 2015-12-25
    • 1970-01-01
    相关资源
    最近更新 更多