sql-builder
Go to file
lj-wsdj d6927858df fix 2024-08-06 10:49:29 +08:00
conf 新增oracle 2024-08-06 10:38:28 +08:00
db fix 2024-08-06 10:49:29 +08:00
util fix 2024-08-05 19:44:11 +08:00
.gitignore fix 2024-08-06 10:40:52 +08:00
README.md fix 2024-06-04 10:25:16 +08:00
go.mod 新增oracle 2024-08-06 10:38:28 +08:00
go.sum 新增oracle 2024-08-06 10:38:28 +08:00
main_test.go fix 2024-08-06 10:49:29 +08:00
sql_builder.go fix 2024-08-05 19:44:11 +08:00

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接口的结构体指针

注意:

  1. sql-builder可以对sql进行占位符处理@c表示条件@o表示排序@g表示分组@s表示查询字段分别对应sqlbuilder.Opts中的Conditions、Orders、Groups、Selects字段。
  2. 占位符相比对应字段内的元素只能多不能少否则会报错。例如在sql中有三个@c占位符则Opts.Conditions中必须有不多于三个的元素。
  3. 可以使用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)