sqlTool.go 3.0 KB
package utils

import (
	"fmt"
	"oppmg/common/log"
	"oppmg/protocol"
	"strings"

	"github.com/astaxie/beego/orm"
)

//PrintLogSql 打印sql语句
func PrintLogSql(sql string, param ...interface{}) {
	format := `SQL EXCEUTE:[%s]-%s`
	parmformat := `[%v]`
	var p strings.Builder
	for i := range param {
		p.WriteString(fmt.Sprintf(parmformat, param[i]))
	}
	log.Debug(format, sql, p.String())
}

//ExecuteQueryOne 执行原生sql查询单条记录;结果用结构体接收
func ExecuteQueryOne(result interface{}, sqlstr string, param ...interface{}) error {
	PrintLogSql(sqlstr, param...)
	var err error
	o := orm.NewOrm()
	err = ExecuteQueryOneWithOrmer(o, result, sqlstr, param)
	return err
}

//ExecuteQueryOneWithOrmer 执行原生sql查询单条
func ExecuteQueryOneWithOrmer(o orm.Ormer, result interface{}, sqlstr string, param ...interface{}) error {
	PrintLogSql(sqlstr, param...)
	var err error
	err = o.Raw(sqlstr, param).QueryRow(result)
	if err != nil {
		return fmt.Errorf("SQL Execute err:%s", err)
	}
	return nil
}

//ExecuteQuerySql 执行原生sql查询多条记录
func ExecuteQueryAll(result interface{}, sqlstr string, param ...interface{}) error {
	PrintLogSql(sqlstr, param...)
	var err error
	o := orm.NewOrm()
	err = ExecuteQueryAllWithOrmer(o, result, sqlstr, param)
	return err
}

//ExecuteQueryOneWithOrmer 执行原生sql查询多条记录
func ExecuteQueryAllWithOrmer(o orm.Ormer, result interface{}, sqlstr string, param ...interface{}) error {
	PrintLogSql(sqlstr, param...)
	var (
		err error
	)
	_, err = o.Raw(sqlstr, param).QueryRows(result)
	if err != nil {
		return fmt.Errorf("SQL Execute err:%s", err)
	}
	return nil
}

func ExecuteSQLWithOrmer(o orm.Ormer, sqlstr string, param ...interface{}) error {
	PrintLogSql(sqlstr, param...)
	var (
		err error
	)
	r, err := o.Raw(sqlstr, param...).Exec()
	if err != nil {
		return err
	}
	num, _ := r.RowsAffected()
	log.Debug("RowsAffected:%d", num)
	return nil
}

type QueryDataByPage struct {
	CountSql string
	DataSql  string
	Param    []interface{}
	offset   int
	num      int
}

func NewQueryDataByPage(countsql, datasql string) *QueryDataByPage {
	return &QueryDataByPage{
		CountSql: countsql,
		DataSql:  datasql,
	}
}

//AddParam 添加条件参数
func (q *QueryDataByPage) AddParam(param ...interface{}) {
	q.Param = param
}

func (q *QueryDataByPage) LimitPage(offset, num int) {
	q.offset = offset
	q.num = num
}

//Query 执行分页查询
func (q *QueryDataByPage) Query(result interface{}) (pageinfo protocol.ResponsePageInfo, err error) {
	pagebegin := (q.offset - 1) * q.num
	if pagebegin < 0 {
		pagebegin = 0
	}
	var (
		total int
	)
	o := orm.NewOrm()
	err = ExecuteQueryOneWithOrmer(o, &total, q.CountSql, q.Param...)
	if err != nil {
		return
	}
	if total == 0 {
		return protocol.ResponsePageInfo{CurrentPage: q.offset, TotalPage: total}, nil
	}
	q.DataSql = fmt.Sprintf("%s limit %d,%d", q.DataSql, pagebegin, q.num)
	err = ExecuteQueryAllWithOrmer(o, result, q.DataSql, q.Param...)
	if err != nil {
		return
	}
	return protocol.ResponsePageInfo{CurrentPage: q.offset, TotalPage: total}, nil
}