From 1cfeaaacbd57ffc28fa7b20873a27e6fd4931e17 Mon Sep 17 00:00:00 2001 From: lj-wsdj <1134294381@qq.com> Date: Mon, 29 Apr 2024 15:59:38 +0800 Subject: [PATCH] first --- .gitignore | 4 ++ README.md | 100 +++++++++++++++++++++++++++++++++++++++++++++++++ db/add_sql.go | 57 ++++++++++++++++++++++++++++ db/build.go | 97 +++++++++++++++++++++++++++++++++++++++++++++++ db/db.go | 60 +++++++++++++++++++++++++++++ go.mod | 20 ++++++++++ go.sum | 82 ++++++++++++++++++++++++++++++++++++++++ main_test.go | 69 ++++++++++++++++++++++++++++++++++ sql_builder.go | 11 ++++++ util/const.go | 9 +++++ util/page.go | 11 ++++++ 11 files changed, 520 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 db/add_sql.go create mode 100644 db/build.go create mode 100644 db/db.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main_test.go create mode 100644 sql_builder.go create mode 100644 util/const.go create mode 100644 util/page.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f75d98e --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +logs +.idea +.idea +app.conf diff --git a/README.md b/README.md new file mode 100644 index 0000000..e46719b --- /dev/null +++ b/README.md @@ -0,0 +1,100 @@ +# 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()) +sql_builder.Opts = db.Options{ + Sql: "select autoseq,name from tsysuser where del = 0 @c @c order by @o", + Orders: []string{"autoseq desc"}, + Conditions: []db.Condition{ + {Cond: "autoseq in (?)", Args: []interface{}{1, 2, 3, 4, 5}}, + }, +} +page.Data = &data +err := sql_builder.PaginateBySql(page.Data, &page) +fmt.Println(err, data) +``` \ No newline at end of file diff --git a/db/add_sql.go b/db/add_sql.go new file mode 100644 index 0000000..b4fece0 --- /dev/null +++ b/db/add_sql.go @@ -0,0 +1,57 @@ +package db + +import ( + "fmt" + "reflect" + "strings" +) + +// 如果添加的条件是in条件,则格式为"id in (?)",args参数为slice类型,并且每次调用该方法只能有一个in条件 +func (s *SqlBuilder[T]) Conditions(cond string, args ...interface{}) { + if strings.HasPrefix(cond, " and") { + cond = strings.Join(strings.Split(cond, " and")[1:], " and ") + } + cond, args = dealInCondition(cond, args) + condition := Condition{Cond: cond, Args: args} + s.Opts.Conditions = append(s.Opts.Conditions, condition) + s.Opts.args = append(s.Opts.args, args...) +} + +func (s *SqlBuilder[T]) Selects(selects ...string) { + s.Opts.Selects = append(s.Opts.Selects, selects...) +} + +func (s *SqlBuilder[T]) Groups(groups ...string) { + s.Opts.Groups = append(s.Opts.Groups, groups...) +} + +func (s *SqlBuilder[T]) Orders(orders ...string) { + s.Opts.Orders = append(s.Opts.Orders, orders...) +} + +func (s *SqlBuilder[T]) Partitions(partitions ...string) { + s.Opts.Partitions = append(s.Opts.Partitions, partitions...) +} + +func dealInCondition(cond string, args []interface{}) (string, []interface{}) { + if ok := strings.Contains(cond, "(?)"); !ok { + return cond, args + } + var newArgs []interface{} + for i := 0; i < len(args); i++ { + //判断args参数是否为slice + if reflect.TypeOf(args[i]).Kind() == reflect.Slice { + var str []string + for j := 0; j < reflect.ValueOf(args[i]).Len(); j++ { + //如果是slice,则将cond里的?替代为args的长度个? + str = append(str, "?") + //将args[i]里的元素添加到new_args里 + newArgs = append(newArgs, reflect.ValueOf(args[i]).Index(j).Interface()) + } + cond = strings.Replace(cond, "(?)", fmt.Sprintf("(%s)", strings.Join(str, ",")), -1) + } else { + newArgs = append(newArgs, args[i]) + } + } + return cond, newArgs +} diff --git a/db/build.go b/db/build.go new file mode 100644 index 0000000..4b5cdc0 --- /dev/null +++ b/db/build.go @@ -0,0 +1,97 @@ +package db + +import ( + "fmt" + "strings" + + "git.botann.com/lj_wsdj/sqlbuilder/util" +) + +func (c *Condition) dealCondition() { + if strings.HasPrefix(c.Cond, " and") { + c.Cond = strings.Join(strings.Split(c.Cond, " and")[1:], " and ") + } + c.Cond, c.Args = dealInCondition(c.Cond, c.Args) +} + +func (s *SqlBuilder[T]) buildSql() string { + s.buildSelect() + s.buildGroup() + s.buildOrder() + s.buildPartition() + s.buildCondition() + return s.Opts.Sql +} + +func (s *SqlBuilder[T]) buildPaginateSql(sqls string) string { + s.Opts.Page.Init() + pageIndex := s.Opts.Page.GetPageIndex() + pageSize := s.Opts.Page.GetPageSize() + return fmt.Sprintf("%s limit %d offset %d", sqls, pageSize, (pageIndex-1)*pageSize) +} + +func (s *SqlBuilder[T]) buildCountSql(sqls string) string { + return fmt.Sprintf("select count(1) from (%s) as t", sqls) +} + +func (s *SqlBuilder[T]) buildSelect() { + for i, v := range s.Opts.Selects { + n := i + 1 + // 如果是最后一个select字段,则不加逗号 + if i == len(s.Opts.Selects) { + s.Opts.Sql = strings.Replace(s.Opts.Sql, util.SelectPlaceholder, fmt.Sprintf("%s", v), n) + } else { + s.Opts.Sql = strings.Replace(s.Opts.Sql, util.SelectPlaceholder, fmt.Sprintf("%s,", v), n) + } + } + s.Opts.Sql = strings.Replace(s.Opts.Sql, util.SelectPlaceholder, "", -1) +} + +func (s *SqlBuilder[T]) buildCondition() { + for i, v := range s.Opts.Conditions { + n := i + 1 + v.dealCondition() + s.Opts.Sql = strings.Replace(s.Opts.Sql, util.ConditionPlaceholder, fmt.Sprintf(" and %s", v.Cond), n) + } + s.Opts.Sql = strings.Replace(s.Opts.Sql, util.ConditionPlaceholder, "", -1) +} + +func (s *SqlBuilder[T]) buildGroup() { + for i, v := range s.Opts.Groups { + n := i + 1 + // 如果是最后一个group字段,则不加逗号 + if n == len(s.Opts.Groups) { + s.Opts.Sql = strings.Replace(s.Opts.Sql, util.GroupPlaceholder, fmt.Sprintf(" %s", v), n) + } else { + s.Opts.Sql = strings.Replace(s.Opts.Sql, util.GroupPlaceholder, fmt.Sprintf(" %s,", v), n) + } + } + s.Opts.Sql = strings.Replace(s.Opts.Sql, util.GroupPlaceholder, "", -1) +} + +func (s *SqlBuilder[T]) buildOrder() { + for i, v := range s.Opts.Orders { + n := i + 1 + // 如果是最后一个order字段,则不加逗号 + if n == len(s.Opts.Orders) { + s.Opts.Sql = strings.Replace(s.Opts.Sql, util.OrderPlaceholder, fmt.Sprintf(" %s", v), n) + } else { + s.Opts.Sql = strings.Replace(s.Opts.Sql, util.OrderPlaceholder, fmt.Sprintf(" %s,", v), n) + } + } + s.Opts.Sql = strings.Replace(s.Opts.Sql, util.OrderPlaceholder, "", -1) +} + +// tdengine专用 +func (s *SqlBuilder[T]) buildPartition() { + for i, v := range s.Opts.Partitions { + n := i + 1 + // 如果是最后一个partition字段,则不加逗号 + if n == len(s.Opts.Partitions) { + s.Opts.Sql = strings.Replace(s.Opts.Sql, util.PartitionPlaceholder, fmt.Sprintf(" %s", v), n) + } else { + s.Opts.Sql = strings.Replace(s.Opts.Sql, util.PartitionPlaceholder, fmt.Sprintf(" %s,", v), n) + } + } + s.Opts.Sql = strings.Replace(s.Opts.Sql, util.PartitionPlaceholder, "", -1) +} diff --git a/db/db.go b/db/db.go new file mode 100644 index 0000000..a8c2d7b --- /dev/null +++ b/db/db.go @@ -0,0 +1,60 @@ +package db + +import ( + "git.botann.com/lj_wsdj/sqlbuilder/util" + "git.botann.com/tinycs/boomerang/tydb" + "git.botann.com/tinycs/boomerang/tytaos" +) + +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) +} + +type SqlBuilder[T tydb.QOneRowRst | tytaos.QOneRowRst | int] struct { + Connector SqlConnector[T] + Opts Options +} + +type Condition struct { + Cond string + Args []interface{} +} + +type Options struct { + util.Page + Sql string + Selects []string + Conditions []Condition + Groups []string + Orders []string + Partitions []string // tdengine专用 + args []interface{} // condition的参数 +} + +func (s *SqlBuilder[T]) FindBySql(data interface{}) error { + sqls := s.buildSql() + return s.Connector.QueryEx(sqls, data, s.Opts.args...) +} + +func (s *SqlBuilder[T]) FindOneBySql(data interface{}) error { + sqls := s.buildSql() + err, _ := s.Connector.QueryRow(sqls, data, s.Opts.args...) + return err +} + +func (s *SqlBuilder[T]) PaginateBySql(data interface{}, page util.Page) error { + var err error + var total int + s.Opts.Page = page + sqls := s.buildSql() + count_sql := s.buildCountSql(sqls) + paginage_sql := s.buildPaginateSql(sqls) + err, _ = s.Connector.QueryRow(count_sql, &total, s.Opts.args...) + if err != nil { + return err + } + s.Opts.Page.SetTotal(total) + err = s.Connector.QueryEx(paginage_sql, data, s.Opts.args...) + return err +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..cd74353 --- /dev/null +++ b/go.mod @@ -0,0 +1,20 @@ +module git.botann.com/lj_wsdj/sqlbuilder + +go 1.21.5 + +require ( + git.botann.com/sslt/sslt_deploy v0.0.0-20240416100346-98996842e5cd + git.botann.com/tinycs/boomerang v1.4.6 +) + +require ( + github.com/go-sql-driver/mysql v1.5.0 // indirect + github.com/huaweicloud/huaweicloud-sdk-go-obs v3.23.12+incompatible // indirect + go.uber.org/atomic v1.7.0 // indirect + go.uber.org/multierr v1.6.0 // indirect + go.uber.org/zap v1.21.0 // indirect + golang.org/x/net v0.24.0 // indirect + golang.org/x/text v0.14.0 // indirect + gopkg.in/ini.v1 v1.66.6 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..9c62017 --- /dev/null +++ b/go.sum @@ -0,0 +1,82 @@ +git.botann.com/sslt/sslt_deploy v0.0.0-20240416100346-98996842e5cd h1:2kD+V/m1znvv/R/BqAcXaQi4X1f9YbOAJxHAicUhrjU= +git.botann.com/sslt/sslt_deploy v0.0.0-20240416100346-98996842e5cd/go.mod h1:tnde0QNGN0Ft0eJHiNbG9GWLmansPCOvXBa0RukmHUM= +git.botann.com/tinycs/boomerang v1.4.6 h1:8RiTvF8lOqODmlHpvtVkkpfkObKRe4A+yg3Voh8OtTU= +git.botann.com/tinycs/boomerang v1.4.6/go.mod h1:Wq6dcPR0KIlV5J+b1PfGdx9HLBFjDD+tJp3hhrtmIaQ= +github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0= +github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/huaweicloud/huaweicloud-sdk-go-obs v3.23.12+incompatible h1:6WXo8ZNdlLKO1drIRTaoArVwyMqvG1gXU30VmNHxqk8= +github.com/huaweicloud/huaweicloud-sdk-go-obs v3.23.12+incompatible/go.mod h1:l7VUhRbTKCzdOacdT4oWCwATKyvZqUOlOqr0Ous3k4s= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/taosdata/driver-go/v3 v3.5.0 h1:30crN+E+ACURmq28kn3Y8B3jfL5knaC1fc1rLvgyXqs= +github.com/taosdata/driver-go/v3 v3.5.0/go.mod h1:H2vo/At+rOPY1aMzUV9P49SVX7NlXb3LAbKw+MCLrmU= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main_test.go b/main_test.go new file mode 100644 index 0000000..1d73993 --- /dev/null +++ b/main_test.go @@ -0,0 +1,69 @@ +package sqlbuilder + +import ( + "fmt" + "testing" + + "git.botann.com/lj_wsdj/sqlbuilder/db" + _ "git.botann.com/sslt/sslt_deploy/config" + "git.botann.com/tinycs/boomerang/tydb" +) + +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 +} + +func TestMain(m *testing.M) { + var data []struct { + Autoseq int + Name string + } + var page Page + sql_builder := NewSqlBuilder(tydb.DB()) + sql_builder.Opts = db.Options{ + Sql: "select autoseq,name from tsysuser where del = 0 @c @c order by @o", + Orders: []string{"autoseq desc"}, + Conditions: []db.Condition{ + {Cond: "autoseq in (?)", Args: []interface{}{1, 2, 3, 4, 5}}, + }, + } + page.Data = &data + err := sql_builder.PaginateBySql(page.Data, &page) + fmt.Println(err, data) +} diff --git a/sql_builder.go b/sql_builder.go new file mode 100644 index 0000000..d285a72 --- /dev/null +++ b/sql_builder.go @@ -0,0 +1,11 @@ +package sqlbuilder + +import ( + "git.botann.com/lj_wsdj/sqlbuilder/db" + "git.botann.com/tinycs/boomerang/tydb" + "git.botann.com/tinycs/boomerang/tytaos" +) + +func NewSqlBuilder[T tydb.QOneRowRst | tytaos.QOneRowRst | int](connector db.SqlConnector[T]) *db.SqlBuilder[T] { + return &db.SqlBuilder[T]{Connector: connector} +} diff --git a/util/const.go b/util/const.go new file mode 100644 index 0000000..ff62b2f --- /dev/null +++ b/util/const.go @@ -0,0 +1,9 @@ +package util + +const ( + SelectPlaceholder = "@s" + ConditionPlaceholder = "@c" + GroupPlaceholder = "@g" + OrderPlaceholder = "@o" + PartitionPlaceholder = "@p" +) diff --git a/util/page.go b/util/page.go new file mode 100644 index 0000000..9836d13 --- /dev/null +++ b/util/page.go @@ -0,0 +1,11 @@ +package util + +type Page interface { + Init() + GetPageIndex() int + GetPageSize() int + GetTotal() int + SetPageIndex(int) + SetpageSize(int) + SetTotal(int) +}