|
||
---|---|---|
conf | ||
db | ||
instantclient_23_3 | ||
util | ||
.gitignore | ||
README.md | ||
go.mod | ||
go.sum | ||
main_test.go | ||
sql_builder.go |
README.md
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接口的结构体指针
注意:
- sql-builder可以对sql进行占位符处理,@c表示条件,@o表示排序,@g表示分组,@s表示查询字段,分别对应sqlbuilder.Opts中的Conditions、Orders、Groups、Selects字段。
- 占位符相比对应字段内的元素只能多,不能少,否则会报错。例如,在sql中有三个@c占位符,则Opts.Conditions中必须有不多于三个的元素。
- 可以使用InsertConditions等以Insert开头的方法,此时占位符应使用@c1,@c2等以数字结尾的字符。
示例:
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)