2017-02-10 48 views
0
插入多行

我有以下傳入淨荷:For循環,以SQL

msg.payload : array [16] 
[ "C-2B", "C-3A", "C-3B", "C-3C", "C-3E", "C-3F", "C-4A", "C-4B", "C-4D", "C-4E", "C-4F", "C-5A", "C-5B", "C-5C", "C-5D", "C-5E" ] 

上述有效載荷被輸入到以下功能節點(其然後將被轉發到適當的opt_alarms表:

for (i = 0; i < msg.payload.length; i++){ 
    insert = "INSERT INTO opt_alarms VALUES (now(),'RECEIVING', '"+ String(msg.payload[i]) +"')"; 
    return {topic:insert, payload:insert} 
} 

我試圖解析傳入淨荷,並將它列出每個值,從輸入陣列,在一個單獨的行內的opt_alarms TABLE。任何建議,將不勝感激。

+0

你不想從函數返回,因爲這將擺脫困境,第一全功能的你想'node.send(msg}' – hardillb

回答

2

如果您嘗試在循環內使用return,我建議使用map而不是for循環。因此,而不是一個for循環:

var statements = msg.payload.map(function(x){ 
    return "INSERT INTO opt_alarms VALUES (now(),'RECEIVING', '" + string(x) + "'"; 
}); 

這是不太等效的,但是因爲要創建一個使用兩個相同的SQL兩個元素的對象,它至少值的數組轉換成SQL語句的數組。

這不是SQL注入安全,所以你要仔細看看是否支持參數化查詢,如果不確定你是否清理你的輸入到MySQL規範。

+0

我想你錯過了VALUES語句的右括號,否則它是一個很好的解決方案:) – codtex

1

@Chris Travers解決方案工作的很好,如果你想爲每個值在msg.payload有一個INSERT語句。有了這樣一些修改:

var insertIntoSql = "INSERT INTO opt_alarms VALUES " + msg.payload.map(function(x){ 
    return "(now(),'RECEIVING', '" + String(x) + "')"; 
}).join(','); 

你可以有一個單一的INSERT語句是這樣的:

INSERT INTO opt_alarms VALUES 
(now(),'RECEIVING', 'C-2B'),(now(),'RECEIVING', 'C-3A'),(now(),'RECEIVING', 'C-3B'),(now(),'RECEIVING', 'C-3C'),(now(),'RECEIVING', 'C-3E'),(now(),'RECEIVING', 'C-3F'),(now(),'RECEIVING', 'C-4A'),(now(),'RECEIVING', 'C-4B'),(now(),'RECEIVING', 'C-4D'),(now(),'RECEIVING', 'C-4E'),(now(),'RECEIVING', 'C-4F'),(now(),'RECEIVING', 'C-5A'),(now(),'RECEIVING', 'C-5B'),(now(),'RECEIVING', 'C-5C'),(now(),'RECEIVING', 'C-5D'),(now(),'RECEIVING', 'C-5E')