TDengineDBProducer
一、说明
TDengineDBProducer适配TDengineDB时序数据库,可以定时/变化存储变量数据
通道只支持 Other
二、插件属性配置项

属性 | 说明 | 备注 |
---|---|---|
链接字符串 | 链接字符串 | |
表名称 | 超级表名称,子表名称为 [超级表名称]_变量名称 | |
分组上传 | 启用后,无论是定时还是变化模式,始终会上传变量分组属性为key分组的全部变量 。在变化模式时,每次变量变化都会触发一次组上传 | False |
是否选择全部变量 | 是否选择全部变量,true时不需要单个变量添加业务属性 | |
上传模式 | 间隔/变化/变化和间隔同时生效 | |
定时上传间隔 | 间隔执行时间 | |
启用缓存 | 是否启用缓存 | |
缓存文件最大长度(mb) | 缓存文件最大长度 | |
上传每页条数 | 每一次上传的列表最大数量 | |
内存队列最大数量 | 内存队列的最大数量,超出或失败时转入文件缓存,根据数据量设定适当值 | |
历史库动态脚本 | 历史库动态脚本 |
三、脚本与实体
3.1、脚本接口
public abstract class DynamicSQLBase
{
public TouchSocket.Core.ILog Logger { get; set; }
/// <summary>
/// 建库建表
/// </summary>
/// <returns></returns>
public virtual Task DBInit(ISqlSugarClient db, CancellationToken cancellationToken)
{
throw new NotSupportedException();
}
/// <summary>
/// 自定义上传
/// </summary>
/// <returns></returns>
public virtual Task DBInsertable(ISqlSugarClient db, IEnumerable<object> datas, CancellationToken cancellationToken)
{
throw new NotSupportedException();
}
}
完全自定义上传
在DBInsertable
方法中,自主实现上传逻辑,自定义Sql语句或通过orm执行
Demo
using ThingsGateway.Plugin.DB;
using SqlSugar;
using System.Text;
using ThingsGateway.Gateway.Application;
using TouchSocket.Core;
public class Taos : DynamicSQLBase
{
public override async Task DBInsertable(ISqlSugarClient db, IEnumerable<object> datas, CancellationToken cancellationToken)
{
StringBuilder stringBuilder = new();
stringBuilder.Append($"INSERT INTO");
var dbInserts = datas.Cast<IDBHistoryValue>();
//(`id`,`createtime`,`collecttime`,`isonline`,`value`)
foreach (var deviceGroup in dbInserts.GroupBy(a => a.DeviceName))
{
foreach (var variableGroup in deviceGroup.GroupBy(a => a.Name))
{
stringBuilder.Append($"""
`tablename1_{deviceGroup.Key}_{variableGroup.Key}`
USING `tablename1` TAGS ("{deviceGroup.Key}", "{variableGroup.Key}")
VALUES
""");
foreach (var item in variableGroup)
{
stringBuilder.Append($"""(NOW,"{item.CollectTime.ToString("yyyy-MM-dd HH:mm:ss.fff")}",{item.Id},{item.IsOnline},"{item.Value}"),""");
}
stringBuilder.Remove(stringBuilder.Length - 1, 1);
}
}
stringBuilder.Append(';');
stringBuilder.AppendLine();
await db.Ado.ExecuteCommandAsync(stringBuilder.ToString(), default, cancellationToken: cancellationToken).ConfigureAwait(false);
LogMessage?.Trace($"Count {datas.Count()}");
}
public override async Task DBInit(ISqlSugarClient db, CancellationToken cancellationToken)
{
var sql = $"""
CREATE STABLE IF NOT EXISTS `tablename1`(
`createtime` TIMESTAMP ,
`collecttime` TIMESTAMP ,
`id` BIGINT ,
`isonline` BOOL ,
`value` VARCHAR(255) ) TAGS(`devicename` VARCHAR(100) ,`name` VARCHAR(100))
""";
await db.Ado.ExecuteCommandAsync(sql, default, cancellationToken: cancellationToken).ConfigureAwait(false);
}
}
3.2、脚本传入内容
public interface IDBHistoryValue
{
DateTime CollectTime { get; set; }
DateTime CreateTime { get; set; }
string DeviceName { get; set; }
public long Id { get; set; }
bool IsOnline { get; set; }
string Name { get; set; }
string Value { get; set; }
}