y595705120 1 år sedan
förälder
incheckning
8eac22ac30
1 ändrade filer med 188 tillägg och 0 borttagningar
  1. 188 0
      db/query.go

+ 188 - 0
db/query.go

@@ -0,0 +1,188 @@
+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) 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
+}