221 lines
4.1 KiB
Markdown
221 lines
4.1 KiB
Markdown
# 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
|
||
```
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|