98 lines
2.6 KiB
Markdown
98 lines
2.6 KiB
Markdown
# 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中必须有不多于三个的元素。
|
||
|
||
示例:
|
||
```
|
||
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())
|
||
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")
|
||
page.Data = &data
|
||
err := sql_builder.PaginateBySql(page.Data, &page)
|
||
fmt.Println(err, data)
|
||
```
|