2024-09-14 15:57:03 +08:00
|
|
|
|
package tdmap
|
2024-09-14 13:12:52 +08:00
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"database/sql"
|
2024-09-18 16:51:30 +08:00
|
|
|
|
"encoding/json"
|
2024-09-14 13:12:52 +08:00
|
|
|
|
"fmt"
|
|
|
|
|
"testing"
|
|
|
|
|
"time"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type TaosTAG struct {
|
|
|
|
|
DevId string `db:"dev_id" taos:"tag"`
|
|
|
|
|
DevType string `db:"dev_type" taos:"tag"`
|
|
|
|
|
DataType string `db:"data_type" taos:"tag"`
|
|
|
|
|
Alias string `db:"alias"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type TaosDevice struct {
|
|
|
|
|
*TaosTAG
|
|
|
|
|
Ts time.Time `db:"ts"` // 时间戳
|
|
|
|
|
Ts2 *time.Time `db:"ts2"` // 时间戳
|
|
|
|
|
LoadUnitId string `db:"load_unit_id" taos:"tag"` // 负载单体 id
|
|
|
|
|
NullInt *int `db:"null_int"`
|
|
|
|
|
DefString string `db:"def_string"`
|
|
|
|
|
PInt *int `db:"p_int"`
|
|
|
|
|
NullInt64 sql.NullInt64 `db:"null_int64"`
|
|
|
|
|
NullInt32 sql.NullInt32 `db:"null_int32"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *TaosDevice) SuperTableName() string {
|
|
|
|
|
return "super_device"
|
|
|
|
|
}
|
|
|
|
|
func (s *TaosDevice) TableName() string {
|
|
|
|
|
return "device_" + s.DevId
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type TaosUser struct {
|
|
|
|
|
*TaosTAG
|
|
|
|
|
Name string `db:"name" taos:"tag"`
|
|
|
|
|
Ts time.Time `db:"ts"` // 时间戳
|
|
|
|
|
// 体重
|
|
|
|
|
Weight int `db:"weight"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *TaosUser) SuperTableName() string {
|
|
|
|
|
return "super_user"
|
|
|
|
|
}
|
|
|
|
|
func (s *TaosUser) TableName() string {
|
|
|
|
|
return "user_" + s.DevId
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestBuilderInsert(t *testing.T) {
|
2024-09-18 16:51:30 +08:00
|
|
|
|
tdMapper := NewMapper()
|
2024-09-14 13:12:52 +08:00
|
|
|
|
p := 1
|
|
|
|
|
data := []any{
|
|
|
|
|
&TaosDevice{
|
2024-09-18 16:51:30 +08:00
|
|
|
|
TaosTAG: &TaosTAG{DevId: "设备ID", DevType: "测试设备", DataType: "测试数据"},
|
|
|
|
|
Ts: time.Now(), LoadUnitId: "负载单体ID", PInt: &p, NullInt32: sql.NullInt32{Int32: 32, Valid: true},
|
2024-09-14 13:12:52 +08:00
|
|
|
|
},
|
|
|
|
|
&TaosUser{
|
2024-09-18 16:51:30 +08:00
|
|
|
|
TaosTAG: &TaosTAG{DevId: "User001", DevType: "User类型", DataType: "User数据类型001"},
|
|
|
|
|
Ts: time.Now(), Name: "张三",
|
2024-09-14 13:12:52 +08:00
|
|
|
|
}, &TaosUser{
|
2024-09-18 16:51:30 +08:00
|
|
|
|
TaosTAG: &TaosTAG{DevId: "User002", DevType: "User类型", DataType: "User数据类型002"},
|
|
|
|
|
Ts: time.Now(), Name: "李四", Weight: 110,
|
2024-09-14 13:12:52 +08:00
|
|
|
|
}, &TaosUser{
|
2024-09-18 16:51:30 +08:00
|
|
|
|
TaosTAG: &TaosTAG{DevId: "User002", DevType: "User类型", DataType: "User数据类型002"},
|
|
|
|
|
Name: "李四", Ts: time.Now(), Weight: 100,
|
2024-09-14 13:12:52 +08:00
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
2024-09-18 16:51:30 +08:00
|
|
|
|
insertSql, err := tdMapper.ToInsertSQL(data...)
|
2024-09-14 13:12:52 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
fmt.Println(insertSql)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type User struct {
|
|
|
|
|
Name string `db:"name" taos:"tag"`
|
|
|
|
|
Age int `db:"age"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (u *User) TableName() string {
|
|
|
|
|
return "user_" + u.Name
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (u *User) SuperTableName() string {
|
|
|
|
|
return "super_user"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestSimpleInsert(t *testing.T) {
|
2024-09-18 16:51:30 +08:00
|
|
|
|
tdMapper := NewMapper()
|
2024-09-14 13:12:52 +08:00
|
|
|
|
data := []any{
|
|
|
|
|
&User{Name: "张三", Age: 18},
|
|
|
|
|
&User{Name: "李四", Age: 20},
|
|
|
|
|
}
|
2024-09-18 16:51:30 +08:00
|
|
|
|
|
|
|
|
|
insertSql, err := tdMapper.ToInsertSQL(data...)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
fmt.Println(insertSql)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type SuperDevTAG struct {
|
|
|
|
|
DevId string `db:"dev_id" taos:"tag"`
|
|
|
|
|
DevType string `db:"dev_type" taos:"tag"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type SuperDev struct {
|
|
|
|
|
SuperDevTAG
|
|
|
|
|
Ts time.Time `db:"ts"` // 时间戳
|
|
|
|
|
AppSn string `db:"app_sn"`
|
|
|
|
|
Ct float64 `db:"ct"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *SuperDev) SuperTableName() string {
|
|
|
|
|
return "super_dev"
|
|
|
|
|
}
|
|
|
|
|
func (s *SuperDev) TableName() string {
|
|
|
|
|
return "dev_" + s.DevId
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestSuperDevInsert(t *testing.T) {
|
|
|
|
|
var data = []any{
|
|
|
|
|
&SuperDev{
|
|
|
|
|
SuperDevTAG: SuperDevTAG{DevId: "SN001", DevType: "模拟设备"},
|
|
|
|
|
Ts: time.Now(), AppSn: "a0001", Ct: 1.0,
|
|
|
|
|
},
|
|
|
|
|
&SuperDev{
|
|
|
|
|
SuperDevTAG: SuperDevTAG{DevId: "SN001", DevType: "模拟设备"},
|
|
|
|
|
Ts: time.Now().Add(time.Second), AppSn: "a0002", Ct: 2.0,
|
|
|
|
|
},
|
|
|
|
|
&SuperDev{
|
|
|
|
|
SuperDevTAG: SuperDevTAG{DevId: "SN002", DevType: "模拟设备"},
|
|
|
|
|
Ts: time.Now(), AppSn: "a0003", Ct: 3.0,
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tdMapper := NewMapper()
|
|
|
|
|
insertSql, err := tdMapper.ToInsertSQL(data...)
|
2024-09-14 13:12:52 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
fmt.Println(insertSql)
|
|
|
|
|
}
|
2024-09-18 16:51:30 +08:00
|
|
|
|
|
|
|
|
|
func TestScanRows(t *testing.T) {
|
|
|
|
|
/*
|
|
|
|
|
文档参考: https://docs.taosdata.com/reference/connector/go/#websocket-%E8%BF%9E%E6%8E%A5
|
|
|
|
|
|
|
|
|
|
go get github.com/taosdata/driver-go/v3
|
|
|
|
|
|
|
|
|
|
import _ "github.com/taosdata/driver-go/v3/taosWS"
|
|
|
|
|
|
|
|
|
|
超级表创建
|
|
|
|
|
CREATE STABLE `super_dev` (`ts` TIMESTAMP , `app_sn` VARCHAR(500) , `ct` INT ) TAGS (`dev_id` VARCHAR(50), `dev_type` VARCHAR(50))
|
|
|
|
|
|
|
|
|
|
批量插入
|
|
|
|
|
INSERT INTO
|
|
|
|
|
`dev_SN001` USING `super_dev` (`dev_id`,`dev_type`) TAGS ('SN001','模拟设备') (`ts`,`app_sn`,`ct`)
|
|
|
|
|
VALUES ('2024-09-18T16:22:17+08:00','a0001',1),('2024-09-18T16:22:18+08:00','a0002',2)
|
|
|
|
|
`dev_SN002` USING `super_dev` (`dev_id`,`dev_type`) TAGS ('SN002','模拟设备') (`ts`,`app_sn`,`ct`)
|
|
|
|
|
VALUES ('2024-09-18T16:22:17+08:00','a0003',3)
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
var taosUri = "root:taosdata@localhost:6041/test"
|
|
|
|
|
db, err := sql.Open("taosWS", taosUri)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rows, err := db.Query("select * from super_dev order by ts desc limit 100")
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
defer func() { _ = rows.Close() }()
|
|
|
|
|
|
|
|
|
|
tdMapper := NewMapper()
|
|
|
|
|
|
|
|
|
|
var sd SuperDev
|
|
|
|
|
if err = tdMapper.ScanRows(&sd, rows); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
indent, _ := json.MarshalIndent(&sd, "", " ")
|
|
|
|
|
fmt.Println(string(indent))
|
|
|
|
|
|
|
|
|
|
//var sdArray []SuperDev
|
|
|
|
|
//if err = tdMapper.ScanRows(&sdArray, rows); err != nil {
|
|
|
|
|
// t.Fatal(err)
|
|
|
|
|
//}
|
|
|
|
|
//marshal, _ := json.MarshalIndent(sdArray, "", " ")
|
|
|
|
|
//fmt.Println(len(sdArray), string(marshal))
|
|
|
|
|
}
|