Files
tdengine-mapper-go/README.md
zhoujie b9413d6c40 perf(scan): 使用缓存减少对象扫描
抽取函数,优化变量命名
支持了传入数组类型
2025-11-27 18:24:36 +08:00

221 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# tdengine-mapper-go
> Golang 的 struct 与 TDengine 表进行映射
## 一、简单使用
### struct 标签
```
db : 表的列名, 值为 "" 或 "-" 表示忽略
taos : taos的标签目前只有 [tag], 表示当前是 超级表的 TAG 字段
```
### struct 接口
```go
type SuperTableNamer interface {
SuperTableName() string // 获取超级表的表名 可选
}
type TableNamer interface {
TableName() string // 当前表的表名
}
```
`TableNamer` 是必须要实现的接口
`SuperTableName` 是可选实现的,如果没有 实现,就会当普通表进行处理
### 批量插入 -- 示例
```go
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)
}
------------------------------------------------------
INSERT INTO
`user_张三` USING `super_user` (`name`) TAGS ('张三') (`age`) VALUES (18)
`user_李四` USING `super_user` (`name`) TAGS ('李四') (`age`) VALUES (20)
```
### 查询映射 -- 示例
```go
// 如果没有结果,会返回 sql.ErrNoRows
func QueryOne(db *sql.DB) (*User,error){
tdMapper := NewMapper()
rows,err:=db.Query("select * from User limit 100")
if err!=nil {
return err
}
defer rows.Close()
var user User
if err:=ScanRows(&user,rows);err!=nil {
return err
}
return &user, nil
}
// 如果查询结果数量为0不会返回错误
func QueryAll(db *sql.DB)([]*User, error) {
tdMapper := NewMapper()
rows,err:=db.Query("select * from User limit 100")
if err!=nil {
return err
}
defer rows.Close()
var users []*User
if err:=ScanRows(&users,rows);err!=nil {
return err
}
return &users, nil
}
```
## 二、嵌入其他项目调试
### 源码集成调试
例如 想要在 UserProject 中进行调试
我们可以使用 go wrok 来集成
现在 tdengine-mapper-go 和 UserProject 位于同一个目录
```text
cd UserProject
go work init
go work add .
go work add ../tdengine-mapper-go
```
这样将会得到一个 go.work 文件
```text
go 1.24.10
use (
.
../tdengine-mapper-go
)
```
接下来 就可以直接在 UserProject 修改 tdengine-mapper-go中的源码了当然在 tdengine-mapper-go 项目中直接修改也是可以的
#### 善后
调试完成后,在 tdengine-mapper-go 将代码提交
删除 UserProject 中的 go.work 文件
## 三、打标签提交
在其他项目中使用,实际上拉去的是 tdengine-mapper-go 标签版本,也就是说当我们完成之后,只是提交了 master 分支还不够,必须要将代码打上版本标签才然后推送出去,别人才能拉去到项目。
现在在假设你已经完成了代码的提交。
**git tag 操作**
```bash
# 查看现有 tag
git tag # 展示所有tag
git tag -n # 展示tag和提交信息
git show 标签名 # 查看某个 tag
# 创建 tag
git tag -a '版本号' -m '提交信息' # 打标签
git tag -am '提交信息' 版本号
# tag 重命名
git tag 老标签名 新标签名
git tag -d 老标签名
# 推送 tag
git push origin 标签名 # 推送单个 tag
git push origin --tags # 推送全部 tag
# 删除 tag
git tag -d 标签名 # 本地删除 tag
git push origin --delete 标签名 # 远程删除 tag
# 检出 tag
git checkout -b 分支名称 标签名
git checkout 标签名
```
开始操作
```bash
// 先看下现在已经拥有的tag标签
$ git tag
v0.0.1 v0.0.2 v0.0.3 v0.0.4 v0.0.5 v0.0.6 v0.0.7 v0.0.8 v0.0.9 v0.1.0
// 命名新的tag标签 并写上标签的 说明
// 比如提交内容是这样的:
// 1. 补充了 readme.md 上的调试说明
// 2. 修复了空指针的 BUG
$ git tag -a 'v0.1.1' -m "1. 补充了 readme.md 上的调试说明
2. 修复了空指针的 BUG"
// 验证 查看 tag 信息
git show v0.1.1
// 然后推送到服务器
$ git push origin v0.1.1
```