集成规则中的占位符问题

问题描述

在使用规则过程中遇到写入数据库异常,经检查为占位符问题导致

emqx版本-5.10.0

复现

1、创建postgresql数据库连接器,测试连接正常。打开禁用预处理语句功能

2、规则中使用SQL过滤数据,语法如下:


使用调试功能正常过滤数据,结果如下:

附,一组测试数据:

{"SN":"d6bb9e8ef40d95a2","Timestamp":1753196893990787600,"SensorNumber":5,"GasName":"VOC","GasUnit":"ppm","Concentration":0.0,"Range":200.0,"Status":1}

3、在动作输出中添加动作,测试连接正常,结果如下

4、在规则的模拟测试中,输入测试数据,结果提示Postgresql动作执行失败。日志如下:

{
  "time": "2025-07-23T20:22:38.449188+08:00",
  "msg": "action_template_rendered",
  "meta": {
    "trace_tag": "QUERY_RENDER",
    "rule_trigger_ts": [
      1753273358448
    ],
    "rule_ids": [
      "rule_nbpm"
    ],
    "result": {
      "statement_type": "query",
      "statement_or_name": "INSERT INTO $1(timestamp, concentration, range, gasunit) VALUES ($2, $3, $4, $5)",
      "data": [
        "voc",
        1753196893990787600,
        0,
        200,
        "ppm"
      ]
    },
    "client_ids": [
      "c_emqx"
    ],
    "action_info": {
      "type": "pgsql",
      "name": "test"
    }
  },
  "level": "debug"
}

同时,检查服务器Postgresql日志显示syntax error错误

2025-07-23 20:02:35.726 CST [3810412] Sensor@d6bb9e8ef40d95a2 ERROR:  syntax error at or near "$1" at character 13
2025-07-23 20:02:35.726 CST [3810412] Sensor@d6bb9e8ef40d95a2 STATEMENT:  INSERT INTO $1(timestamp, concentration, range, gasunit) VALUES ($2, $3, $4, $5)

问题

如何修复数据传递异常,将payload数据写入postgresql数据库

谢谢

你好,我的版本是5.3.2 windows版,怎么在规则中没有写入数据库的功能呢,请问你知道吗

开源版都没有,要企业版,文档有标注的

这个sql不支持,试试把。Tablename固定,一步步排查一下

通过替换参数,将规则中表名和参数使用固定值,可以在客户端发送指令后写入数据库


将规则中的参数使用占位符获取mqtt信息后,写入数据库失败

MQTT SQL测试输出:


规则测试输出:

服务器postgresql警告日志:

将写入数据中的字符串数据剔除,使用如下规则,数据库写入成功

image

问题:
写入失败是否因为字符串类型数据使用双引号导致语法不匹配?