代码拉取完成,页面将自动刷新
---
id: 305
title: TDengineDBProducer
---
import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';
:::tip `提示`
taos数据库插件只支持原生连接,需要安装连接驱动 [官方文档](https://docs.taosdata.com/develop/connect/#%E5%AE%89%E8%A3%85%E5%AE%A2%E6%88%B7%E7%AB%AF%E9%A9%B1%E5%8A%A8-taosc)
:::
## 一、说明
TDengineDBProducer适配TDengineDB时序数据库,可以定时/变化存储变量数据
通道只支持 Other
## 二、插件属性配置项
<img src={require("@site/static/img/docs/TDengineDBProducer1.png").default} />
| 属性 | 说明 | 备注|
| ---------------| --------------------------| ---|
| 链接字符串 | 链接字符串 ||
| 表名称 | 超级表名称,子表名称为 [超级表名称]_变量名称 | |
| 分组上传 | 启用后,无论是定时还是变化模式,始终会上传**变量分组属性**为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 ThingsGateway.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; }
}
```
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。