赞
踩
目录
在之前工作项目中,有这样的项目需求:比如一台自动化设备,内部控制器支持mdobus TCP协议,我们需要与该设备进行数据通讯,采集设备内部生产工艺数据,并将数据传给第三方平台。当时我们的做法是采物联网关、物联网盒子,通过盒子采集设备的数据,再将数据传给第三方平台,盒子网关一般是通过mqtt或者数据库的方式传给第三方平台,但是在Node Red中,就可以直接通过拖拉节点,编写少量的代码,读取设备数据,将数据写入数据库中,以供第三方平台调取数据,本文章主要讲解如何将数据写入mysql数据库中,对于编程基础薄弱的同学,可以利用工具GPT辅助编写,最终效果是可以实现的。
这里以MySQL数据库为例,提前创建好表单,其余数据库可以参考,NodeRed支持数据库较多,可以根据需求下载测试。
dome测试数据库结构,仅供参考。
该节点允许对 MySQL 数据库进行基本访问。对配置的数据库使用查询操作。允许插入和删除,SQL注入,所以需要小心使用。
msg.topic必须保存对数据库的查询,结果在 中返回。msg.payload
msg.payload可以包含要绑定到主题的值数组。
通常,返回的有效负载将是结果行的数组。注: 这些是 RowDataPacket 类型,而不是完全标准的对象。如果未找到键,则返回 null,可以通过在设置中添加一行来更改以毫秒为单位的重新连接超时.js
3、插入数据
INSERT INTO 语句
INSERT INTO 语句用于向表格中插入新的行。
语法
INSERT INTO 表名称 VALUES (值1, 值2,....)
我们也可以指定所要插入数据的列:
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
下面就是由GPT写的,已验证ok,function节点
- // 获取当前的计数值或设定初始值为0
- var count = context.get('count') || 0;
-
- // 递增计数值
- count++;
- // 获取最新时间,存储在timestamp
- const timestamp = Math.floor(Date.now() / 1000);
- const formattedDate = new Date(timestamp * 1000).toISOString().slice(0, 19).replace('T', ' ');
- // 更新计数值
- context.set('count', count);
-
- // 将计数值作为消息的新属性(例如:id)
- var id = count;
- var datatype = "Int16";
- var keypad = "大家好";
- var value = "666";
- var SQL = "INSERT INTO mytab2(id, datatype, keypad, value, time) VALUES(?, ?, ?, ?, ?)";
-
- // 返回更新后的消息
- msg.topic = SQL;
- msg.payload = [id, datatype, keypad, value, formattedDate]; // 使用格式转换后的日期时间字符串
- return msg;
需要注意这里的表单,id作为主键,需要保证唯一性,我们重启node RED之后,id会重新排序,导致刚开始的数据会报错,无法写入数据库,方法由两种
1、一直注入数据,当id不重复之后,数据就会写入成功。
2、将数据库表单的数据进行截单,也就是清楚表格数据。
测试写入的数据。
- [
- {
- "id": "7a19bfb7be8b5d8b",
- "type": "inject",
- "z": "17ce5a554745ca34",
- "name": "",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "",
- "crontab": "",
- "once": false,
- "onceDelay": 0.1,
- "topic": "",
- "payload": "",
- "payloadType": "date",
- "x": 170,
- "y": 540,
- "wires": [
- [
- "8bcfb951389664b4"
- ]
- ]
- },
- {
- "id": "b9e22fc6c0c339e3",
- "type": "mysql",
- "z": "17ce5a554745ca34",
- "mydb": "159305cc4ba5d756",
- "name": "mysql",
- "x": 770,
- "y": 540,
- "wires": [
- []
- ]
- },
- {
- "id": "8bcfb951389664b4",
- "type": "function",
- "z": "17ce5a554745ca34",
- "name": "function 2",
- "func": "// 获取当前的计数值或设定初始值为0\nvar count = context.get('count') || 0;\n\n// 递增计数值\ncount++;\n// 获取最新时间,存储在timestamp\nconst timestamp = Math.floor(Date.now() / 1000);\nconst formattedDate = new Date(timestamp * 1000).toISOString().slice(0, 19).replace('T', ' ');\n// 更新计数值\ncontext.set('count', count);\n\n// 将计数值作为消息的新属性(例如:id)\nvar id = count;\nvar datatype = \"Int16\";\nvar keypad = \"大家好\";\nvar value = \"666\";\nvar SQL = \"INSERT INTO mytab2(id, datatype, keypad, value, time) VALUES(?, ?, ?, ?, ?)\";\n\n// 返回更新后的消息\nmsg.topic = SQL;\nmsg.payload = [id, datatype, keypad, value, formattedDate]; // 使用格式转换后的日期时间字符串\nreturn msg;",
- "outputs": 1,
- "timeout": 0,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 480,
- "y": 740,
- "wires": [
- [
- "b9e22fc6c0c339e3"
- ]
- ]
- },
- {
- "id": "159305cc4ba5d756",
- "type": "MySQLdatabase",
- "name": "test",
- "host": "192.168.1.202",
- "port": "3306",
- "db": "test",
- "tz": "",
- "charset": "UTF8"
- }
- ]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。