gpt4 book ai didi

mysql - 在nodejs中循环mysql查询

转载 作者:行者123 更新时间:2023-11-30 22:54:41 25 4
gpt4 key购买 nike

我正在抓取多个网页上的表格,并使用表格中的项目更新 MYSQL 数据库。我正在使用 MYSQL 模块,在遍历所有行时遇到各种错误。这是函数的一次迭代:

  var connection = mysql.createConnection(opts);
connection.connect();

function updateDB(o,lang){
var tbl_name = "news_"+lang;
o.forEach(function(entry,index,arr){
var sql1 = "SELECT * FROM "+tbl_name+" WHERE url = '"+htmlencode.htmlEncode(entry.url)+"' and omit = '1'";
connection.query(sql1, function(err, rows, fields) {
connection.end();
if (err){
console.log("can't run query=" + sql1 +"\n Error="+err);
}
else{
console.log('ROWS:',rows);
// if rows.length = 0 then update table with new info here...
}
});
});
};

如果我注释掉 connection.end() 行,这实际上是有效的,但连接永远不会结束,进程永远保持事件状态。我将其作为批处理脚本运行,因此我需要它优雅地结束。在 connection.end() 到位后,我得到一个 "Cannot enqueue Quit after invoking quit."

我尝试使用 async.series 将 connection.end 放入最终回调中,但这仍然不起作用。我试过使用池和不同的代码迭代来尝试使某些东西起作用。我对使用 mysql 模块束手无策,想知道是否还有另一个工作得更好的模块。

最佳答案

看起来您只有一个连接,并且您使用的是 .forEach,这对异步不友好。

您应该使用连接池和 async.eachLimit 来控制并发。

var pool = mysql.createPool({
host: process.env.MYSQL_HOST,
user: process.env.MYSQL_USER,
password: process.env.MYSQL_PASS,
database: process.env.MYSQL_NAME,
connectionLimit: 10
});

function updateDB(o,lang){
// submit as a sub-function to get the `lang` closure
// this could probably be organized a different way, but this fits your structure
function submit(entry, callback) {
var tbl_name = "news_"+lang;
var sql = [
'SELECT * FROM ' + tbl_name,
' WHERE url="?" and omit="1"'
].join('');
pool.getConnection(function(err, connection) {
if(err) return callback(err);
connection.query(sql, [entry.url], function(err, results) {
connection.release();
if(err) return callback(err);
console.log('ROWS:',results);
});
});
}

async.eachLimit(o, 10, submit, function(err) {
if(err) throw err;
console.log('Done processing');
});
}

您应该几乎总是使用一个池,即使您不需要多个连接也是如此。池将根据需要重新创建连接。这非常方便,因为您的连接可能会因 mysql 超时、网络问题和许多其他原因而中断。当您使用池时,您的代码将更加健壮。

如果一次只想做一个查询,只需将async.eachLimit的第二个参数改为1即可。

关于mysql - 在nodejs中循环mysql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26938092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com