2017-01-13 95 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

謝謝您的回答。我從這個腳本得到了答案,但我仍然得到了錯誤的數據庫名稱。 –