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')
我有以下传入有效载荷:
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')