环境信息
- EMQX 版本:4.4.3
- 操作系统及版本:Linux、CentOS 7.9 、Docker 20.10.9
- 其他
问题描述
EMQX是否支持动态表名插入数据,如果支持的话应该怎么配置?
目前如果写成动态表名插入TDengine数据库是不成功的。
配置文件及日志
- 资源:WebHook方式连接TDengine
- 规则:根据主题生成动态表名
- 动作:Restful形式插入TDengine数据库
# 规则
SELECT
clientid,
concat(payload.group_name, '_123') as tableName
FROM
'test/#'
# sql模板
INSERT INTO test.${tableName} VALUES (
now,
${current},
${voltage},
${phase}
)
emqx就是取出数据拼成tdengine需要的body,发给他。得看看日志他返回什么具体错?
目前看你这action里面的content-type是不需要带的,他就不是个json。
似乎跟content-type没有关系,因为之前用确定的表名是可以写入成功的。比如下面的表test_123
INSERT INTO test.test_123 VALUES (
now,
${current},
${voltage},
${phase}
)
但是用占位符的方式就不行了,所以想问一下,EMQX支不支持 test.${tableName}
这样的动态表名的写法?
应该支持的,你用个debug action看看能不能把tableName打印出来,是不是你没传
payload.group_name。。。
好的,谢谢,我再试试吧。另外还想问一下,规则引擎支不支持遍历json获取键,因为存在很多不同类型的设备,每种设备上传的数据json里属性名是不一样的,insert into test.${tableName} values (now, ${current}, ${voltage}, ${phase})
在这种情况下不通用,规则引擎有没有一种方式根据json的属性和值动态生成insert语句?类似下面这样的通用模板
insert into test.${tableName} (${field}) values (${value})
如果规则引擎不支持的话,想实现这样的功能,有没有其他的方案或者建议?
wivwiv
6
EMQX 5.0 支持使用 jq 来进行复杂的 JSON 处理,这部分文档还在完善中可以试试看:
https://github.com/emqx/emqx-docs/pull/1384
EMQX 4.x 企业版的话,推荐使用编解码功能,相当于扩展 SQL 函数实现想要的处理逻辑
看提供的文档是企业版,是不是只有企业版才有这样的功能?在本地测试用的是4.4.3开源版本,创建资源的下拉选中没有 Parser HTTP
,开源版本中有没有支持的SQL语句或者其他替代方案去实现那样的功能?还说只能用代码实现…
wivwiv
8
是的,编解码仅限企业版。补充一下,也可以尝试 exhook 功能,它可以在 publish 前改写 payload 内容。
感谢您提供的建议,然后去看了官方的文档。不过没有开发过这个,也不了解;
想问一下这两个模块有什么区别?
exhook-svr-java
exproto-svr-java
两个都要启动?还是选择其中一个?