2017-01-13 67 views
0

我想计算表中有FOO表的一行。 以下代码有一个只显示最后一个db_name的错误。在Nodejs中的嵌套查询Mysql

RESULT IS LOOK LIKE THIS: 
db_0099,0 
db_0099,5 
db_0099,10 
db_0099,3 

请问您能否告诉我如何修复nodejs代码?

var mysql = require('mysql'); 

var sql1 = "SELECT table_schema as db_name from information_schema.tables WHERE table_name = 'FOO' "; 
var sql2 = "SELECT COUNT(*) as solution FROM {0}.FOO"; 

var connection = mysql.createConnection({ 
    host  : '$$$$$$$', 
    user  : '$$$$$$$', 
    password : '$$$$$$$', 
}); 

connection.connect(function(err){ 
    console.log('connected as id ' + connection.threadId); 
}); 

connection.query(sql1, function(err, result) { 
    if (err) throw err; 

    for (var i = 0, len = result.length; i < len; i++) { 
    var db_name = result[i].db_name; 
    console.log(db_name); 
    connection.query(sql2.replace("{0}",db_name), function(err, result) { 
     if (err) throw err; 
     console.log(db_name+','+result[0].solution); //Here db_name is showed only the last one. 
    }); 
    }; 

    connection.end(); 
}); 

回答

1

我建议一个两步解决这个问题:

  1. 使用连接池

    变种池= mysql.createPool({ 主机:'xxxxx', 用户:'xxxxx', 密码:'xxxxx', connectionLimit:100 });

池可以做自动连接,所以不要连接到你的数据库,只是

pool.query(sql,function(err,res){}) 

这种方式,您使用的每个查询,它会自动使用它后关闭一个连接。

  1. 使用async等待异步顺序查询。

为创建它返回一个承诺

function getResult(sql){ 
    return new Promise(function(resolve,reject){ 
    pool.query(sql, function(err, result){ 
     if(err){ 
     reject(err) 
     }else{ 
     resolve(result) 
     } 
    }) 
    }) 
} 

那么您可以在回路

pool.query(sql1, async function(err, result) { 
    if (err) throw err; 
    for (var i = 0; i < result.length; i++) { 
    var db_name = result[i].db_name; 
     console.log(db_name); 
     var sql = sql2.replace("{0}",db_name) 
     var res = await getResult(sql) 
     console.log(db_name+','+res[0].solution); //Here db_name is showed only the last one. 
    }; 
    pool.end() 
}); 

PS等待每个查询的getResult功能:异步等待是upcomming节点的功能4月份发布8.0.0。对于节点7.x,您必须使用命令行开关启动脚本

node --harmony-async-await yourscript.js 
+0

非常感谢! –

0

您是否验证了结果的内容? console.log(result);

如果没关系试试这个:

solutions = results.map(result => { 
 
    let dbName = result.db_name; 
 
    let queryResult; 
 
    connection.query(sql2.replace("{0}", dbName), function(err, result) { 
 
     if (err) { 
 
      throw err; 
 
     } else { 
 
     queryResult = `${db_name}, ${result[0].solution}` 
 
     console.log(queryResult); 
 
     } 
 
    }); 
 
    return queryResult; 
 
}) 
 
console.log(solutions);

然而,尝试使用ORM或为您查询SQL语法分析程序!

尝试这一个:)

https://hiddentao.com/squel/

+0

谢谢您的回答。我从这个脚本得到了答案,但我仍然得到了错误的数据库名称。 –