node.js循环数据库插入



我有一个应用程序,有一个地址对象和一个与该应用程序相关联的人员列表。

{
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需要更长的时间。

我建议这样做。

In for loop:

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)... 

最新更新