【问题标题】:For Loop to insert multiple rows in SQLFor循环在SQL中插入多行
【发布时间】:2017-02-10 10:16:36
【问题描述】:

我有以下传入负载:

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表:

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

【问题讨论】:

  • 你不想从函数中返回,因为这将在第一次循环中退出整个函数,你想要node.send(msg}

标签: javascript mysql sql node-red


【解决方案1】:

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

【讨论】:

  • 我认为你错过了 VALUES 语句的右括号,否则这是一个很好的解决方案:)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多