package db import ( "git.botann.com/lijun/sql-builder/util" "git.botann.com/tinycs/boomerang/tydb" "git.botann.com/tinycs/boomerang/tyoracle" "git.botann.com/tinycs/boomerang/tytaos" ) type SqlConnector[T tydb.QOneRowRst | tytaos.QOneRowRst | tyoracle.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 | tyoracle.QOneRowRst | int] struct { Connector SqlConnector[T] Driver string Sql string Opts Options } type Options struct { util.Page selects []string conditions []string args []interface{} // condition的参数 groups []string orders []string partitions []string // tdengine专用 } func (s *SqlBuilder[T]) Clear() { s.Sql = "" s.Opts = Options{} } func (s *SqlBuilder[T]) SetDriver(driver string) { s.Driver = driver } 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 }