2024-04-29 15:59:38 +08:00
|
|
|
|
# sql-builder
|
|
|
|
|
基于git.botann.com/boomerang包中的tydb、tytaos封装的sql构建器
|
|
|
|
|
|
|
|
|
|
使用方法:引入sql-builder包,使用NewSqlBuilder()创建构建器,入参为实现接口SqlConnector的对象。
|
|
|
|
|
|
|
|
|
|
SqlConnector接口定义如下:
|
|
|
|
|
```
|
|
|
|
|
type SqlConnector[T tydb.QOneRowRst | tytaos.QOneRowRst | int] interface {
|
|
|
|
|
QueryEx(sql string, data interface{}, args ...interface{}) error
|
|
|
|
|
QueryRow(sql string, data interface{}, args ...interface{}) (error, T)
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
根据sql查询单条记录:
|
|
|
|
|
```
|
|
|
|
|
sqlBuilder.FindOneBySql(&data)
|
|
|
|
|
入参data为结构体指针,结构体字段和sql查询字段一一对应。
|
|
|
|
|
```
|
|
|
|
|
根据sql查询多条记录:
|
|
|
|
|
```
|
|
|
|
|
sqlBuilder.FindBySql(&data)
|
|
|
|
|
入参data为结构体切片指针,结构体字段和sql查询字段一一对应。
|
|
|
|
|
```
|
|
|
|
|
分页查询:
|
|
|
|
|
```
|
|
|
|
|
需要实现接口Page
|
|
|
|
|
type Page interface {
|
|
|
|
|
Init()
|
|
|
|
|
GetPageIndex() int
|
|
|
|
|
GetPageSize() int
|
|
|
|
|
GetTotal() int
|
|
|
|
|
SetPageIndex(int)
|
|
|
|
|
SetpageSize(int)
|
|
|
|
|
SetTotal(int)
|
|
|
|
|
}
|
|
|
|
|
sqlBuilder.PaginateBySql(&data,&page)
|
|
|
|
|
入参data为结构体切片指针,结构体字段和sql查询字段一一对应。page为实现了Page接口的结构体指针
|
|
|
|
|
```
|
|
|
|
|
注意:
|
|
|
|
|
1. sql-builder可以对sql进行占位符处理,@c表示条件,@o表示排序,@g表示分组,@s表示查询字段,分别对应sqlbuilder.Opts中的Conditions、Orders、Groups、Selects字段。
|
|
|
|
|
2. 占位符相比对应字段内的元素只能多,不能少,否则会报错。例如,在sql中有三个@c占位符,则Opts.Conditions中必须有不多于三个的元素。
|
2024-06-04 10:25:16 +08:00
|
|
|
|
3. 可以使用InsertConditions等以Insert开头的方法,此时占位符应使用@c1,@c2等以数字结尾的字符。
|
2024-04-29 15:59:38 +08:00
|
|
|
|
|
|
|
|
|
示例:
|
|
|
|
|
```
|
|
|
|
|
type Page struct {
|
|
|
|
|
Total int `json:"total" form:"total"`
|
|
|
|
|
PageIndex int `json:"pageIndex" form:"pageIndex"`
|
|
|
|
|
PageSize int `json:"pageSize" form:"pageSize"`
|
|
|
|
|
Data interface{} `json:"data" form:"data"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (p *Page) Init() {
|
|
|
|
|
if p.PageIndex == 0 {
|
|
|
|
|
p.SetPageIndex(1)
|
|
|
|
|
}
|
|
|
|
|
if p.PageSize == 0 {
|
|
|
|
|
p.SetpageSize(10)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (p *Page) GetPageIndex() int {
|
|
|
|
|
return p.PageIndex
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (p *Page) GetPageSize() int {
|
|
|
|
|
return p.PageSize
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (p *Page) GetTotal() int {
|
|
|
|
|
return p.Total
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (p *Page) SetTotal(total int) {
|
|
|
|
|
p.Total = total
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (p *Page) SetPageIndex(pageIndex int) {
|
|
|
|
|
p.PageIndex = pageIndex
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (p *Page) SetpageSize(pageSize int) {
|
|
|
|
|
p.PageSize = pageSize
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var data []struct {
|
|
|
|
|
Autoseq int
|
|
|
|
|
Name string
|
|
|
|
|
}
|
|
|
|
|
var page Page
|
|
|
|
|
sql_builder := NewSqlBuilder(tydb.DB())
|
2024-05-07 17:19:55 +08:00
|
|
|
|
ids := []int{1, 2, 3, 4, 5}
|
|
|
|
|
sql_builder.Sql = `select autoseq,name from tsysuser where del = 0 @c order by @o`
|
|
|
|
|
sql_builder.Conditions("autoseq in (?)", ids)
|
|
|
|
|
sql_builder.Orders("autoseq desc")
|
2024-04-29 15:59:38 +08:00
|
|
|
|
page.Data = &data
|
|
|
|
|
err := sql_builder.PaginateBySql(page.Data, &page)
|
|
|
|
|
fmt.Println(err, data)
|
2024-05-07 17:19:55 +08:00
|
|
|
|
```
|