feat: 新增 ScanRows 接口

This commit is contained in:
2024-09-18 16:51:30 +08:00
parent 030343bc01
commit 1f9ff72824
9 changed files with 311 additions and 102 deletions

View File

@@ -2,6 +2,7 @@ package tdmap
import (
"database/sql"
"encoding/json"
"fmt"
"testing"
"time"
@@ -49,50 +50,26 @@ func (s *TaosUser) TableName() string {
}
func TestBuilderInsert(t *testing.T) {
tdMapping := NewMapping()
tdMapper := NewMapper()
p := 1
data := []any{
&TaosDevice{
TaosTAG: &TaosTAG{
DevId: "设备ID",
DevType: "测试设备",
DataType: "测试数据",
},
Ts: time.Now(),
LoadUnitId: "负载单体ID",
PInt: &p,
NullInt32: sql.NullInt32{Int32: 32, Valid: true},
TaosTAG: &TaosTAG{DevId: "设备ID", DevType: "测试设备", DataType: "测试数据"},
Ts: time.Now(), LoadUnitId: "负载单体ID", PInt: &p, NullInt32: sql.NullInt32{Int32: 32, Valid: true},
},
&TaosUser{
TaosTAG: &TaosTAG{
DevId: "User001",
DevType: "User类型",
DataType: "User数据类型001",
},
Ts: time.Now(),
Name: "张三",
TaosTAG: &TaosTAG{DevId: "User001", DevType: "User类型", DataType: "User数据类型001"},
Ts: time.Now(), Name: "张三",
}, &TaosUser{
TaosTAG: &TaosTAG{
DevId: "User002",
DevType: "User类型",
DataType: "User数据类型002",
},
Ts: time.Now(),
Name: "李四",
Weight: 110,
TaosTAG: &TaosTAG{DevId: "User002", DevType: "User类型", DataType: "User数据类型002"},
Ts: time.Now(), Name: "李四", Weight: 110,
}, &TaosUser{
TaosTAG: &TaosTAG{
DevId: "User002",
DevType: "User类型",
DataType: "User数据类型002",
},
Name: "李四",
Ts: time.Now(),
Weight: 100,
TaosTAG: &TaosTAG{DevId: "User002", DevType: "User类型", DataType: "User数据类型002"},
Name: "李四", Ts: time.Now(), Weight: 100,
},
}
insertSql, err := tdMapping.ToInsertSQL(data...)
insertSql, err := tdMapper.ToInsertSQL(data...)
if err != nil {
t.Fatal(err)
}
@@ -113,14 +90,108 @@ func (u *User) SuperTableName() string {
}
func TestSimpleInsert(t *testing.T) {
tdMapping := NewMapping()
tdMapper := NewMapper()
data := []any{
&User{Name: "张三", Age: 18},
&User{Name: "李四", Age: 20},
}
insertSql, err := tdMapping.ToInsertSQL(data...)
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...)
if err != nil {
t.Fatal(err)
}
fmt.Println(insertSql)
}
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))
}