# 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) ```