For Loop 在 SQL 中插入多行

For Loop to insert multiple rows in 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" ]

上面的payload被输入到下面的函数节点(然后会被转发到合适的opt_alarms table:

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 的单独行中列出传入数组中的每个值。如有任何建议,我们将不胜感激。

如果您尝试在循环中使用 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 规范对您的输入进行清理。

如果您想为 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')