2015-12-02 72 views
1

我有一個對象數組,每個對象都有多個屬性。例如:使用準備好的語句插入多行

var obj = [{a : '1', b : '2'},{a : '3', b : '4'}]; 

爲了匹配數據庫表的順序序列,我生成對於批量插入所需的序列的新的數組。

var bulkInsert = function(arrData){ 
    var orderedData = []; 
    arrData.forEach(function(obj){ 
     orderedData.push(obj.b + ',' + obj.a); 
    }); 
    return orderedData; 
}; 

現在,我想大宗物體的輸出陣列插入到Postgres表:

client.query("INSERT INTO sometable(b, a) VALUES" + 
    " ($1, $2)", [orderedData], function (err, result) { 
     if (err) { 
      return handleError(err, client, done); 
     } 
    }); 

然而,這將引發一個錯誤:

error fetching client from pool { [error: bind message supplies 1 parameters, but prepared statement "" requires 2] 

串行版本工作正常,如果每個插入的情況都是迭代遍歷一個循環,但是對於較大的陣列來說它將會很慢。

+0

''orderedData''應該是'orderedData',因爲該值已經是一個數組。否則,它需要1個變量而不是2個預期值,因此是錯誤。 –

回答

0

嘗試從陣列中刪除方括號。它已經是您不需要它們的數組了

+0

現在我得到這個錯誤:'錯誤提取客戶端從池{[錯誤:綁定消息提供4個參數,但準備語句「」需要2]' – faizanjehangir

0

您應該將參數作爲兩個大小的數組傳遞。爲了同時插入兩行。嘗試重複以下查詢兩次:

client.query("INSERT INTO sometable(b, a) VALUES" + " ($1, $2)", [1,2], function (err, result) { if (err) { return handleError(err, client, done); } }); 

client.query("INSERT INTO sometable(b, a) VALUES" + " ($1, $2)", [3,4], function (err, result) { if (err) { return handleError(err, client, done); } });