For Loop在SQL中插入多行

时间:2017-02-10 10:16:37

标签: javascript mysql sql node-red

我有以下传入的有效载荷:

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中单独一行的每个值。任何建议将不胜感激。

2 个答案:

答案 0 :(得分: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规范的输入。

答案 1 :(得分:1)

如果你想为msg.payload中的每个值都有一个INSERT语句,那么@Chris Travers解决方案效果很好。通过这样的一些修改:

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')