使用GoFrame连接和操作TDengine时序数据库

简介: 通过使用GoFrame框架和TDengine Go驱动,我们可以方便地连接和操作TDengine时序数据库。无论是插入、查询还是分析时序数据,都可以通过简单的API调用来实现。GoFrame提供了强大的Web开发功能,结合TDengine的高性能时序数据存储和查询能力,可以构建高效、可扩展的时序数据应用。

TDengine是一个高性能、可扩展的时序数据库,特别适用于物联网、工业互联网、车联网等场景下的大规模时序数据存储和分析。本文将介绍如何使用GoFrame框架连接和操作TDengine数据库,实现时序数据的插入、查询和分析。

前提条件

在开始之前,确保你已经具备以下条件:

  • 已安装Go语言环境
  • 已安装GoFrame框架
  • 已安装TDengine数据库

安装TDengine Go驱动

首先,我们需要安装TDengine的Go驱动。可以使用以下命令进行安装:

bash

代码解读

复制代码

go get -u github.com/taosdata/driver-go/v2

配置TDengine连接信息

在项目中创建一个配置文件,例如tdengine.yaml,用于配置TDengine的连接信息。

yaml

代码解读

复制代码

# tdengine.yaml
tdengine:
  host: "127.0.0.1"
  port: 6030
  username: "root"
  password: "taosdata"
  database: "test"

其中,hostport表示TDengine服务的地址和端口,usernamepassword表示连接的用户名和密码,database表示要使用的数据库。

连接TDengine数据库

使用以下代码连接TDengine数据库:

go

代码解读

复制代码

package main

import (
	"database/sql"
	"fmt"

	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/os/gctx"
	_ "github.com/taosdata/driver-go/v2/taosSql"
)

func main() {
	// 读取配置
	ctx := gctx.New()
	host := g.Cfg().MustGet(ctx, "tdengine.host").String()
	port := g.Cfg().MustGet(ctx, "tdengine.port").Int()
	username := g.Cfg().MustGet(ctx, "tdengine.username").String()
	password := g.Cfg().MustGet(ctx, "tdengine.password").String()
	database := g.Cfg().MustGet(ctx, "tdengine.database").String()

	// 构建连接字符串
	connStr := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", username, password, host, port, database)

	// 建立连接
	taosConn, err := sql.Open("taosSql", connStr)
	if err != nil {
		g.Log().Fatalf(ctx, "连接TDengine失败: %v", err)
	}
	defer taosConn.Close()

	// 执行查询
	rows, err := taosConn.Query("SHOW DATABASES")
	if err != nil {
		g.Log().Fatalf(ctx, "查询失败: %v", err)
	}
	defer rows.Close()

	// 遍历查询结果
	for rows.Next() {
		var dbName string
		err := rows.Scan(&dbName)
		if err != nil {
			g.Log().Errorf(ctx, "获取数据失败: %v", err)
			continue
		}
		fmt.Printf("数据库名称: %s\n", dbName)
	}
}

在上述代码中,我们读取配置文件中的TDengine连接信息,构建连接字符串,并使用sql.Open函数建立连接。然后,使用Query方法执行查询语句,并遍历查询结果。

注意:

由于其原生的驱动使用了cgo,因此需要安装gcc编译工具,才能编译出可执行文件。如果没有gcc环境建议使用其restful api

插入时序数据

使用以下代码插入时序数据到TDengine数据库:

go

代码解读

复制代码

package main

import (
	"database/sql"
	"fmt"
	"time"

	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/os/gctx"
)

func main() {
	// 读取配置
	ctx := gctx.New()
	host := g.Cfg().MustGet(ctx, "tdengine.host").String()
	port := g.Cfg().MustGet(ctx, "tdengine.port").Int()
	username := g.Cfg().MustGet(ctx, "tdengine.username").String()
	password := g.Cfg().MustGet(ctx, "tdengine.password").String()
	database := g.Cfg().MustGet(ctx, "tdengine.database").String()

	// 构建连接字符串
	connStr := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", username, password, host, port, database)

	// 建立连接
	taosConn, err := sql.Open("taosSql", connStr)
	if err != nil {
		g.Log().Fatalf(ctx, "连接TDengine失败: %v", err)
	}
	defer taosConn.Close()

	// 创建数据表
	_, err = taosConn.Exec("CREATE TABLE IF NOT EXISTS sensor_data (ts TIMESTAMP, temperature FLOAT, humidity FLOAT)")
	if err != nil {
		g.Log().Fatalf(ctx, "创建数据表失败: %v", err)
	}

	// 插入数据
	now := time.Now()
	temperature := 25.5
	humidity := 60.8
	_, err = taosConn.Exec("INSERT INTO sensor_data (ts, temperature, humidity) VALUES (?, ?, ?)", now, temperature, humidity)
	if err != nil {
		g.Log().Fatalf(ctx, "插入数据失败: %v", err)
	}

	fmt.Println("数据插入成功")
}

在上述代码中,我们首先使用Exec方法创建一个名为sensor_data的数据表,用于存储传感器数据。然后,使用Exec方法插入一条时序数据,包括当前时间戳、温度和湿度值。

查询时序数据

使用以下代码查询TDengine数据库中的时序数据:

go

代码解读

复制代码

package main

import (
	"database/sql"
	"fmt"
	"time"

	"github.com/gogf/gf/os/gctx"
	"github.com/gogf/gf/v2/frame/g"
)

func main() {
	// 读取配置
	ctx := gctx.New()
	host := g.Cfg().MustGet(ctx, "tdengine.host").String()
	port := g.Cfg().MustGet(ctx, "tdengine.port").Int()
	username := g.Cfg().MustGet(ctx, "tdengine.username").String()
	password := g.Cfg().MustGet(ctx, "tdengine.password").String()
	database := g.Cfg().MustGet(ctx, "tdengine.database").String()

	// 构建连接字符串
	connStr := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", username, password, host, port, database)

	// 建立连接
	taosConn, err := sql.Open("taosSql", connStr)
	if err != nil {
		g.Log().Fatalf(ctx, "连接TDengine失败: %v", err)
	}
	defer taosConn.Close()

	// 查询数据
	startTime := time.Now().Add(-1 * time.Hour)
	endTime := time.Now()
	rows, err := taosConn.Query("SELECT * FROM sensor_data WHERE ts BETWEEN ? AND ?", startTime, endTime)
	if err != nil {
		g.Log().Fatalf(ctx, "查询数据失败: %v", err)
	}
	defer rows.Close()

	// 遍历查询结果
	for rows.Next() {
		var ts time.Time
		var temperature, humidity float32
		err := rows.Scan(&ts, &temperature, &humidity)
		if err != nil {
			g.Log().Errorf(ctx, "获取数据失败: %v", err)
			continue
		}
		fmt.Printf("时间: %s, 温度: %.2f, 湿度: %.2f\n", ts.Format(time.RFC3339), temperature, humidity)
	}
}

在上述代码中,我们使用Query方法查询最近一小时内的传感器数据。通过指定时间范围条件ts BETWEEN ? AND ?,可以获取指定时间范围内的数据。然后,遍历查询结果,并打印每条数据的时间戳、温度和湿度值。

批量数据插入

使用以下代码批量插入TDengine数据库中的时序数据:

go

代码解读

复制代码

package main

import (
	"fmt"
	"github.com/taosdata/driver-go/v2/af"
	"github.com/gogf/gf/os/gctx"
	"github.com/gogf/gf/v2/frame/g"
)

func main() {
	// 读取配置
	ctx := gctx.New()
	host := g.Cfg().MustGet(ctx, "tdengine.host").String()
	port := g.Cfg().MustGet(ctx, "tdengine.port").Int()
	username := g.Cfg().MustGet(ctx, "tdengine.username").String()
	password := g.Cfg().MustGet(ctx, "tdengine.password").String()

	// 创建连接
	conn, err := af.Open(host, username, password, "", port)
	if err != nil {
		g.Log().Fatalf(ctx, "连接TDengine失败: %v", err)
	}
	defer conn.Close()

	// 准备数据
	data := []string{
		`{"metric":"sensor_data","timestamp":1623000000000,"temperature":25.5,"humidity":60.8}`,
		`{"metric":"sensor_data","timestamp":1623000001000,"temperature":26.2,"humidity":59.5}`,
		`{"metric":"sensor_data","timestamp":1623000002000,"temperature":24.8,"humidity":61.2}`,
	}

	// 批量插入数据
	err = conn.InfluxDBInsertLines(data, "ms")
	if err != nil {
		g.Log().Fatalf(ctx, "批量插入数据失败: %v", err)
	}

	fmt.Println("批量插入数据成功")
}

我们使用af.Open函数创建与TDengine的连接。af.Open函数接受连接配置、主机、用户名、密码、数据库名称和端口作为参数。我们使用af.DefaultConfig()获取默认的连接配置。

接下来,我们准备一个字符串切片data,其中每个元素都是一个InfluxDB行协议格式的数据点字符串。数据点包含度量名称(metric)、时间戳(timestamp)以及其他字段(如temperature和humidity)。

最后,我们调用连接对象的InfluxDBInsertLines方法将准备好的数据批量插入到TDengine中。InfluxDBInsertLines方法接受数据点字符串的切片和时间戳精度作为参数。这里我们使用"ms"表示时间戳精度为毫秒。

使用InfluxDBInsertLines方法可以方便地将InfluxDB行协议格式的数据批量插入到TDengine中,无需手动创建表结构。

总结

通过使用GoFrame框架和TDengine Go驱动,我们可以方便地连接和操作TDengine时序数据库。无论是插入、查询还是分析时序数据,都可以通过简单的API调用来实现。GoFrame提供了强大的Web开发功能,结合TDengine的高性能时序数据存储和查询能力,可以构建高效、可扩展的时序数据应用。

希望通过本文的介绍,你能够了解如何在GoFrame项目中集成TDengine,并利用其强大的时序数据处理能力,开发出优秀的时序数据应用。


转载来源https://juejin.cn/post/7408847526298746920

相关文章
|
1月前
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:详细步骤与最佳实践指南ali01n.xinmi1009fan.com
随着Web开发技术的不断进步,ASP.NET已成为一种非常流行的Web应用程序开发框架。在ASP.NET项目中,我们经常需要与数据库进行交互,特别是SQL数据库。本文将详细介绍如何在ASP.NET项目中连接SQL数据库,并提供最佳实践指南以确保开发过程的稳定性和效率。一、准备工作在开始之前,请确保您
160 3
|
21天前
|
关系型数据库 MySQL 数据库连接
python脚本:连接数据库,检查直播流是否可用
【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
120 68
|
17天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
31 3
|
24天前
|
关系型数据库 MySQL 数据库连接
DBeaver如何连接一个数据库
【10月更文挑战第27天】DBeaver 是一款功能强大的通用数据库管理工具,支持多种主流数据库。本文介绍了使用 DBeaver 连接数据库的基本步骤,包括下载安装、创建新连接、选择数据库类型、配置连接参数、测试连接以及最终连接到数据库。详细的操作指南帮助用户轻松管理和操作数据库。
124 9
|
17天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
16 1
|
17天前
|
Java 数据库连接 数据库
Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销
本文深入探讨了Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销,显著提升了系统的响应速度和吞吐量。文章介绍了连接池的工作原理,并以HikariCP为例,展示了如何在Java应用中使用连接池。通过合理配置和优化,连接池技术能够有效提升应用性能。
33 1
|
26天前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
29天前
|
存储 JSON Ubuntu
时序数据库 TDengine 支持集成开源的物联网平台 ThingsBoard
本文介绍了如何结合 Thingsboard 和 TDengine 实现设备管理和数据存储。Thingsboard 中的“设备配置”与 TDengine 中的超级表相对应,每个设备对应一个子表。通过创建设备配置和设备,实现数据的自动存储和管理。具体操作包括创建设备配置、添加设备、写入数据,并展示了车辆实时定位追踪和车队维护预警两个应用场景。
51 3
|
1月前
|
SQL Java 数据库连接
如何使用`DriverManager.getConnection()`连接数据库,并利用`PreparedStatement`执行参数化查询,有效防止SQL注入。
【10月更文挑战第6天】在代码与逻辑交织的世界中,我从一名数据库新手出发,通过不断探索与实践,最终成为熟练掌握JDBC的开发者。这段旅程充满挑战与惊喜,从建立数据库连接到执行SQL语句,再到理解事务管理和批处理等高级功能,每一步都让我对JDBC有了更深的认识。示例代码展示了如何使用`DriverManager.getConnection()`连接数据库,并利用`PreparedStatement`执行参数化查询,有效防止SQL注入。
85 5
|
1月前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
69 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库

热门文章

最新文章