package tdmap import ( "database/sql" "encoding/json" "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) { 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}, }, &TaosUser{ 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, }, &TaosUser{ TaosTAG: &TaosTAG{DevId: "User002", DevType: "User类型", DataType: "User数据类型002"}, Name: "李四", Ts: time.Now(), Weight: 100, }, } insertSql, err := tdMapper.ToInsertSQL(data...) 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) { tdMapper := NewMapper() data := []any{ &User{Name: "张三", Age: 18}, &User{Name: "李四", Age: 20}, } 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)) }