diff --git a/README.md b/README.md index e46719b..7724656 100644 --- a/README.md +++ b/README.md @@ -87,14 +87,11 @@ var data []struct { } 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}}, - }, -} +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) -``` \ No newline at end of file +``` diff --git a/conf/conf.go b/conf/conf.go new file mode 100644 index 0000000..c8a88e6 --- /dev/null +++ b/conf/conf.go @@ -0,0 +1,16 @@ +package conf + +import ( + "git.botann.com/tinycs/boomerang/tyconf" + "git.botann.com/tinycs/boomerang/tyconf/ini" +) + +var APP AppConf + +type AppConf struct { + tyconf.SuperConfig +} + +func init() { + ini.LoadConfig("app.conf", &APP) +} diff --git a/db/add_sql.go b/db/add_sql.go index b4fece0..a056be8 100644 --- a/db/add_sql.go +++ b/db/add_sql.go @@ -12,25 +12,24 @@ func (s *SqlBuilder[T]) Conditions(cond string, args ...interface{}) { 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.conditions = append(s.Opts.conditions, cond) s.Opts.args = append(s.Opts.args, args...) } func (s *SqlBuilder[T]) Selects(selects ...string) { - s.Opts.Selects = append(s.Opts.Selects, selects...) + s.Opts.selects = append(s.Opts.selects, selects...) } func (s *SqlBuilder[T]) Groups(groups ...string) { - s.Opts.Groups = append(s.Opts.Groups, groups...) + s.Opts.groups = append(s.Opts.groups, groups...) } func (s *SqlBuilder[T]) Orders(orders ...string) { - s.Opts.Orders = append(s.Opts.Orders, orders...) + s.Opts.orders = append(s.Opts.orders, orders...) } func (s *SqlBuilder[T]) Partitions(partitions ...string) { - s.Opts.Partitions = append(s.Opts.Partitions, partitions...) + s.Opts.partitions = append(s.Opts.partitions, partitions...) } func dealInCondition(cond string, args []interface{}) (string, []interface{}) { @@ -40,6 +39,7 @@ func dealInCondition(cond string, args []interface{}) (string, []interface{}) { var newArgs []interface{} for i := 0; i < len(args); i++ { //判断args参数是否为slice + fmt.Println(reflect.TypeOf(args[i]).Kind()) if reflect.TypeOf(args[i]).Kind() == reflect.Slice { var str []string for j := 0; j < reflect.ValueOf(args[i]).Len(); j++ { diff --git a/db/build.go b/db/build.go index 4b5cdc0..ff21472 100644 --- a/db/build.go +++ b/db/build.go @@ -4,23 +4,16 @@ import ( "fmt" "strings" - "git.botann.com/lj_wsdj/sqlbuilder/util" + "git.botann.com/lijun/sql-builder/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 + return s.Sql } func (s *SqlBuilder[T]) buildPaginateSql(sqls string) string { @@ -35,63 +28,62 @@ func (s *SqlBuilder[T]) buildCountSql(sqls string) string { } func (s *SqlBuilder[T]) buildSelect() { - for i, v := range s.Opts.Selects { + 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) + if i == len(s.Opts.selects) { + s.Sql = strings.Replace(s.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.Sql = strings.Replace(s.Sql, util.SelectPlaceholder, fmt.Sprintf("%s,", v), n) } } - s.Opts.Sql = strings.Replace(s.Opts.Sql, util.SelectPlaceholder, "", -1) + s.Sql = strings.Replace(s.Sql, util.SelectPlaceholder, "", -1) } func (s *SqlBuilder[T]) buildCondition() { - for i, v := range s.Opts.Conditions { + 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.Sql = strings.Replace(s.Sql, util.ConditionPlaceholder, fmt.Sprintf(" and %s", v), n) } - s.Opts.Sql = strings.Replace(s.Opts.Sql, util.ConditionPlaceholder, "", -1) + s.Sql = strings.Replace(s.Sql, util.ConditionPlaceholder, "", -1) } func (s *SqlBuilder[T]) buildGroup() { - for i, v := range s.Opts.Groups { + 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) + if n == len(s.Opts.groups) { + s.Sql = strings.Replace(s.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.Sql = strings.Replace(s.Sql, util.GroupPlaceholder, fmt.Sprintf(" %s,", v), n) } } - s.Opts.Sql = strings.Replace(s.Opts.Sql, util.GroupPlaceholder, "", -1) + s.Sql = strings.Replace(s.Sql, util.GroupPlaceholder, "", -1) } func (s *SqlBuilder[T]) buildOrder() { - for i, v := range s.Opts.Orders { + 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) + if n == len(s.Opts.orders) { + s.Sql = strings.Replace(s.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.Sql = strings.Replace(s.Sql, util.OrderPlaceholder, fmt.Sprintf(" %s,", v), n) } } - s.Opts.Sql = strings.Replace(s.Opts.Sql, util.OrderPlaceholder, "", -1) + s.Sql = strings.Replace(s.Sql, util.OrderPlaceholder, "", -1) } // tdengine专用 func (s *SqlBuilder[T]) buildPartition() { - for i, v := range s.Opts.Partitions { + 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) + if n == len(s.Opts.partitions) { + s.Sql = strings.Replace(s.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.Sql = strings.Replace(s.Sql, util.PartitionPlaceholder, fmt.Sprintf(" %s,", v), n) } } - s.Opts.Sql = strings.Replace(s.Opts.Sql, util.PartitionPlaceholder, "", -1) + s.Sql = strings.Replace(s.Sql, util.PartitionPlaceholder, "", -1) } diff --git a/db/db.go b/db/db.go index a8c2d7b..f08c4f7 100644 --- a/db/db.go +++ b/db/db.go @@ -1,7 +1,9 @@ package db import ( - "git.botann.com/lj_wsdj/sqlbuilder/util" + "fmt" + + "git.botann.com/lijun/sql-builder/util" "git.botann.com/tinycs/boomerang/tydb" "git.botann.com/tinycs/boomerang/tytaos" ) @@ -13,23 +15,18 @@ type SqlConnector[T tydb.QOneRowRst | tytaos.QOneRowRst | int] interface { type SqlBuilder[T tydb.QOneRowRst | tytaos.QOneRowRst | int] struct { Connector SqlConnector[T] + Sql string 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专用 + selects []string + conditions []string args []interface{} // condition的参数 + groups []string + orders []string + partitions []string // tdengine专用 } func (s *SqlBuilder[T]) FindBySql(data interface{}) error { @@ -48,6 +45,7 @@ func (s *SqlBuilder[T]) PaginateBySql(data interface{}, page util.Page) error { var total int s.Opts.Page = page sqls := s.buildSql() + fmt.Println(sqls) count_sql := s.buildCountSql(sqls) paginage_sql := s.buildPaginateSql(sqls) err, _ = s.Connector.QueryRow(count_sql, &total, s.Opts.args...) diff --git a/go.mod b/go.mod index cd74353..2a57b62 100644 --- a/go.mod +++ b/go.mod @@ -1,20 +1,14 @@ -module git.botann.com/lj_wsdj/sqlbuilder +module git.botann.com/lijun/sql-builder 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 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 index 9c62017..3380c52 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,3 @@ -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= @@ -15,8 +13,6 @@ 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= @@ -47,8 +43,6 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn 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= @@ -59,8 +53,6 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc 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= @@ -77,6 +69,5 @@ gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24 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 h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= 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 index 1d73993..1b6b24e 100644 --- a/main_test.go +++ b/main_test.go @@ -4,8 +4,7 @@ import ( "fmt" "testing" - "git.botann.com/lj_wsdj/sqlbuilder/db" - _ "git.botann.com/sslt/sslt_deploy/config" + _ "git.botann.com/lijun/sql-builder/conf" "git.botann.com/tinycs/boomerang/tydb" ) @@ -56,13 +55,10 @@ func TestMain(m *testing.M) { } 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}}, - }, - } + 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) diff --git a/sql_builder.go b/sql_builder.go index d285a72..43650bb 100644 --- a/sql_builder.go +++ b/sql_builder.go @@ -1,7 +1,7 @@ package sqlbuilder import ( - "git.botann.com/lj_wsdj/sqlbuilder/db" + "git.botann.com/lijun/sql-builder/db" "git.botann.com/tinycs/boomerang/tydb" "git.botann.com/tinycs/boomerang/tytaos" ) @@ -9,3 +9,7 @@ import ( func NewSqlBuilder[T tydb.QOneRowRst | tytaos.QOneRowRst | int](connector db.SqlConnector[T]) *db.SqlBuilder[T] { return &db.SqlBuilder[T]{Connector: connector} } + +func DefaultSqlBuilder() *db.SqlBuilder[tydb.QOneRowRst] { + return NewSqlBuilder(tydb.DB()) +}