|
@@ -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
|
|
|
+}
|