2014-05-06 45 views
1

我試圖向MySQL數據庫中插入幾個(hundres /數千)記錄。我的問題是我不確定怎麼做最好的方法。例如:NodeJS - 如何向MySQL插入多行

function saveData(data, callback) { 
    var dataLength = data.length, 
     saved = []; 

    for (var i = 0; i < dataLength; i++) { 
     db.query("INSERT INTO table VALUES (?, ?, ?)", data[i], function(err, res) { 
      if (err) { 
       // ... 
      } 

      saved.push(res.insertId); 
     }); 
    } 
} 

問題是,所有數據保存後(保存[]​​包含所有ID)我需要將此數組傳遞給回調。很明顯,我不能立即做到這一點......我必須等待所有的疑問才能完成。

問題:我應該使用for循環還是遞歸執行它(下一個插入將在以前完成後調用),我應該檢查如果saved.length === dataLength,然後返回數組或是有更好的方法如何做到這一點?

+0

只要一切都在內存適合我沒有看到什麼不對您的解決方案 – soulcheck

+0

我不能決定是否是更好地在一次執行所有查詢然後等待結果或更好地執行一個查詢,等待結果然後執行另一個結果。我正在使用池連接,所以查詢將是conn.query(...); – 0101

+0

我正在使用模塊node-mysql2。我認爲對數據庫的查詢以async的形式工作,所以我可以註冊(比方說)十個回調十等待結果。我錯了嗎? – 0101

回答

2

這裏是你如何與async做到這一點:

function saveData(data, cb) { 
    async.mapSeries(data, function(queryData, callback) { 
    db.query("INSERT INTO table VALUES (?, ?, ?)", queryData, function(err, res) { 
     if (err) 
     callback(err); 
     else 
     callback(null, res.insertId); 
    }); 
    }, cb); 
    // cb will be passed `err, saved` 
}