2017-02-10 93 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')