时序库插入数据失败

Blade 未结 2 112
82101697
82101697 2026-03-26 11:59

一、该问题的重现步骤是什么?

1. 

2. 

3.


二、你期待的结果是什么?实际看到的又是什么?


三、你正在使用的是什么产品,什么版本?在什么操作系统上?


四、请提供详细的错误堆栈信息,这很重要。


五、若有更多详细信息,请在下面提供。

image.png

image.png

image.png

2条回答
  •  82101697
    82101697 (楼主)
    2026-03-26 14:13

    表属性有这个字段,但是数据表没有

    image.png

    image.png

    image.png


    物模型配置:1、创建属性、2、发布属性、3、时序库表结构存在、4、表内没有这个字段

    image.png

    image.png

    作者追问:2026-03-26 14:13

    把他删掉换成 iot_device_name 看看能不能正常

    回答: 2026-03-26 14:13

    可以的哦,是跟原生冲突么

    image.png

    image.png

    作者追问:2026-03-26 14:13

    是的,device_name、product_key这几个算是系统级别的字段了,最好避开,如果需要自用的话,给他加个前缀就行。

    回答: 2026-03-26 14:13

    我想问下,物模型能不能做选择,譬如机器上传了20个字段上来,我时序库只想要其中10个字段,我物模型只要设置想要的10个字段也能保存成功,问题现在是机器上传多少,我物模型就要创建多少,有多余的字段不想要怎么弄???我们机器设定的字段发去客户那里了。要改的话需要OTA,这是比较麻烦的。所以针对这种实际情况需要怎么处置比较好??

    回答: 2026-03-26 14:13

    1、痛点:机器上传20个字段,我只要10个,我模型设置10个,但是会提示缺失字段插入失败

    2、想要:上传20个字段,我模型设置了10个,broker写入时序库的时候要做兼容,只插入我模型设定的10个字段。

    3、我记得以前是可以的,现在改版后不行

    回答: 2026-03-26 14:13

    现在我缺失了这个字段,导致我插入不进去,设备在客户现场不好ota,

    image.png

    作者追问:2026-03-26 14:13

    以前可以是因为用了influxdb,上报数据的时候多了字段influxdb会自动创建,如果现在用influxdb也会自动建。

    现在不行是因为用的tdengine,他有一个超级表的限制,超级表设定了属性后,上报了多余的字段,tdengine本身就会直接报错了。


    如果用td,也想解决这个问题,就需要改源码,在写入td之前遍历物模型缓存,只保留物模型内的字段,其他多余的都删掉,然后再入时序库。但是这样带来的问题是高并发情况下,性能降低不少,所以我们没有支持这个逻辑。


    具体用哪种方案看你们自己选择了。

    回答: 2026-03-26 14:13

    如果用这种方案的话,怎么修改呢?代码块在哪?

    ####就需要改源码,在写入td之前遍历物模型缓存,只保留物模型内的字段,其他多余的都删掉,然后再入时序库。但是这样带来的问题是高并发情况下,性能降低不少,所以我们没有支持这个逻辑。#####

    作者追问:2026-03-26 14:13

    拓展这里的逻辑:https://center.javablade.com/blade/BladeX-Links/src/commit/dca423f06367f74468400a427411d4a26adeedf9/blade-core/blade-tsdb-tdengine/src/main/java/org/springblade/iot/tsdb/tdengine/impl/DeviceDataServiceImpl.java#L54


    https://center.javablade.com/blade/BladeX-Links/src/commit/dca423f06367f74468400a427411d4a26adeedf9/blade-core/blade-tsdb-tdengine/src/main/java/org/springblade/iot/tsdb/tdengine/config/TDEngineConfiguration.java#L98


    注入 ITslCacheService ,使用 Map<String, String> dataTypeMap = tslCacheService.getTslPropertyDataTypeMap(productKey); 获得物模型缓存,然后再对传入的param参数进行比对,把param里不存在缓存里的key删掉就行了。接着传入后续的方法里进行入库操作

    回答: 2026-03-26 14:13

    你好,你这个能否做成开关,如果要兼容就根据客户自己需求做开关

    作者追问:2026-03-26 14:13

    可以这里先发个issue:https://center.javablade.com/blade/BladeX-Links/issues  ,把你的这个需求详细描述下,等后续看排期安排

提交回复