123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- package db
- import (
- "database/sql"
- "fmt"
- "genBrief/common/log"
- "strings"
- )
- type Query struct {
- db *sql.DB
- table string
- attr string
- where string
- from uint32
- to uint32
- order string
- quote string
- args []interface{}
- rows *sql.Rows
- }
- func New(table string) *Query {
- quote := "`"
- if strings.Contains(table, " ") {
- quote = ""
- }
- return &Query{db: p1.Db, table: table, quote: quote, args: []interface{}{}}
- }
- func (sl *Query) LeftJoin(format string, args ...interface{}) *Query {
- sl.table += " LEFT JOIN " + format
- sl.args = append(sl.args, args...)
- sl.quote = ""
- return sl
- }
- func (sl *Query) Match(attrs, value string) *Query {
- sl.init_where()
- //sl.where += " MATCH(" + attrs + ") AGAINST(?)"
- //sl.where += " MATCH(" + attrs + ") AGAINST(? IN BOOLEAN MODE)"
- sl.where += " MATCH(" + attrs + ") AGAINST(? IN NATURAL LANGUAGE MODE)"
- sl.args = append(sl.args, value)
- return sl
- }
- func (sl *Query) Locate(attrs, value string) *Query {
- sl.init_where()
- sl.where += fmt.Sprintf(" LOCATE(?,%v)>0 ", attrs)
- sl.args = append(sl.args, value)
- return sl
- }
- func (sl *Query) Attr(attr string) *Query {
- sl.attr = attr
- return sl
- }
- func (sl *Query) init_where() {
- if sl.where == "" {
- sl.where = " where "
- } else {
- sl.where += " and "
- }
- }
- func (sl *Query) Where(attr string, value interface{}) *Query {
- sl.init_where()
- sl.where += sl.quote + attr + sl.quote + "=?"
- sl.args = append(sl.args, value)
- return sl
- }
- func (sl *Query) WhereF(attr string, value ...interface{}) *Query {
- sl.init_where()
- sl.where += attr
- sl.args = append(sl.args, value...)
- return sl
- }
- func (sl *Query) Like(attr string, value interface{}) *Query {
- sl.init_where()
- sl.where += sl.quote + attr + sl.quote + " like ?"
- sl.args = append(sl.args, "%"+value.(string)+"%")
- return sl
- }
- func (sl *Query) In(attr string, param ...interface{}) *Query {
- if len(param) < 1 {
- return sl
- }
- sl.init_where()
- what := "?"
- for i := 1; i < len(param); i++ {
- what += ",?"
- }
- sl.where += sl.quote + attr + sl.quote + " in (" + what + ")"
- sl.args = append(sl.args, param...)
- return sl
- }
- func (sl *Query) Order(order string) *Query {
- sl.order = order
- return sl
- }
- func (sl *Query) Limit(from, to uint32) *Query {
- sl.from = from
- sl.to = to
- return sl
- }
- func (sl *Query) GetRow() *sql.Row {
- //sqlString := "select " + sl.attr + " from " + sl.table + sl.where + " " + sl.order + " limit 1"
- sqlString := fmt.Sprintf("SELECT %v FROM %v %v %v LIMIT 1", sl.attr, sl.table, sl.where, sl.order)
- row := sl.db.QueryRow(sqlString, sl.args...)
- return row
- }
- func (sl *Query) GetAll() (tableData []map[string]interface{}, err error) {
- //sqlString := "select " + sl.attr + " from " + sl.table + sl.where + sl.order
- sqlString := fmt.Sprintf("SELECT %v FROM %v %v %v", sl.attr, sl.table, sl.where, sl.order)
- // limit 语句
- if sl.to > sl.from {
- sqlString += " limit ?,?"
- sl.args = append(sl.args, sl.from, sl.to)
- }
- var rows *sql.Rows
- if rows, err = sl.db.Query(sqlString, sl.args...); err != nil {
- log.Info("getData", err.Error(), sqlString)
- return
- }
- if tableData, err = FetchData(rows); err != nil {
- log.Info("getData error", err.Error(), sqlString)
- }
- return
- }
- func (sl *Query) GetOne() (data map[string]interface{}, err error) {
- //sqlString := "select " + sl.attr + " from " + sl.table + sl.where + sl.order
- sqlString := fmt.Sprintf("SELECT %v FROM %v %v %v", sl.attr, sl.table, sl.where, sl.order)
- // limit 语句
- sqlString += " limit 1"
- rows, err := sl.db.Query(sqlString, sl.args...)
- if err != nil {
- log.Info("getData", err.Error(), sqlString)
- return
- }
- return FetchOne(rows)
- }
- func (sl *Query) GetWithTotal() (tableData []map[string]interface{}, total int) {
- sqltotal := "select count(1) from " + sl.table + sl.where
- log.Debugf("sqltotal:%v", sqltotal)
- err := sl.db.QueryRow(sqltotal, sl.args...).Scan(&total)
- if err != nil {
- log.Info("gettotal", err.Error(), sqltotal)
- return nil, 0
- }
- //sqlString := "select " + sl.attr + " from " + sl.table + sl.where + sl.order + " limit ?,?"
- sqlString := fmt.Sprintf("SELECT %v FROM %v %v %v LIMIT ?,?", sl.attr, sl.table, sl.where, sl.order)
- sl.args = append(sl.args, sl.from, sl.to)
- log.Debugf("sqlString:%v", sqlString)
- rows, err := sl.db.Query(sqlString, sl.args...)
- if err != nil {
- log.Info("getData", err.Error(), sqlString)
- return nil, 0
- }
- tableData, _ = FetchData(rows)
- return tableData, total
- }
- func SqlOne(sqlString string, args ...interface{}) (map[string]interface{}, error) {
- rows, err := Pool().Db.Query(sqlString, args...)
- if err != nil {
- log.Warnf("SqlOne[%s] err:%v", sqlString, err)
- return nil, err
- }
- return FetchOne(rows)
- }
- func SqlAll(sqlString string, args ...interface{}) []map[string]interface{} {
- tableData := make([]map[string]interface{}, 0)
- rows, err := Pool().Db.Query(sqlString, args...)
- if err != nil {
- log.Warnf("SqlAll[%s] err:%v", sqlString, err)
- return tableData
- }
- tableData, err = FetchData(rows)
- if err != nil {
- log.Warnf("SqlAll[%s] err:%v", sqlString, err)
- return tableData
- }
- return tableData
- }
|