Golang Gorm 封装 分页查询 Where Order 查询

  说说为什么写Gorm,因为公司新项目需要,研究了下Go下的gorm。对于一个项目首先考虑的问题,就是封装一些常用的工具方法,例如多参数查询 where or Like 还有order by Limit 等等,如果不封装后面代码写多了,每个地方代码都不一样,维护更新比较头大。 

  代码框架用的是gin,通过一个完整的案例贴代码吧,经过测试,只要把相关的查询参数梳理好,传参就可以出结果了。

 1 // 管理员列表
 2 func ListHandler(c *gin.Context){
 3     var ResponseRes = common.ResponseMain{
 4         Message: "ok",
 5         Code: http.StatusOK,
 6         Data:"",
 7     }
 8     type Paramet struct {
 9         Page int `form:"page" json:"page" uri:"page"`
10         Limit int `form:"limit" json:"page" uri:"page"`
11         Sort string `form:"sort" json:"sort" uri:"sort"`
12         Name string `form:"name" json:"name" uri:"name"`
13     }
14     var Parament = &Paramet{}
15     if err:= c.BindQuery(Parament); err != nil {
16         ResponseRes.Message = err.Error()
17         ResponseRes.Code=http.StatusMethodNotAllowed
18         c.JSON(http.StatusOK,ResponseRes)
19         return
20     }
21     fmt.Println("接收参数",Parament)
22     var db = model.Db
23     var BcAdmin []common.BcAdmin
24     db.LogMode(true);
    // 传递查询where参数,用了map来定义二维数组
25 where:=map[string]map[string]string{ 26 "AND":{"status":"1","role":"agent"}, 27 "OR":{"pass":"123456"}, 28 "LIKE":{"name":Parament.Name,"id":"1"}, 29 } 30 db.Table("bc_admin"). // 指定表名,如果不指定,表名查询会带复数 加s es,提示查询不到 31 Select("*"). //查询全部字段,暂时没有几个字段,就全部* 32 Scopes(model.Where(where)). // 封装的查询方法需要被Scopes使用 33 Scopes(model.Order(Parament.Sort)). 34 Scopes(model.Paginate(Parament.Page,Parament.Limit)). 35 Find(&BcAdmin) 36 ResponseRes.Data = &BcAdmin 37 c.JSON(http.StatusOK,ResponseRes) 38 }

下面是封装的数据库方法

package model
/**
主要是用于链接数据库
分配链接Db
 */
import (
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
    "log"
)
// 数据库Db已连接
var Db *gorm.DB

func init(){
    db, err := gorm.Open("mysql", "jiangsheng:**123456a***_@tcp(rm-d5e97cc4d4o0698c4xo**.mysql.rds.aliyuncs.com:3306)/bc?charset=utf8mb4&parseTime=true&loc=Local")
    if err != nil {
        log.Panic("bc数据库链接失败",err)
        return
    }
    // 如果设置禁用表名复数形式属性为 true,`User` 的表名将是 `user`
    db.SingularTable(true)
    Db = db
    log.Println("---数据库初始化链接成功---")
    //defer db.Close()  // 后面做连接池
}
/**
分页封装
 */
func Paginate(page int,pageSize int) func(db *gorm.DB) *gorm.DB {
    return func (db *gorm.DB) *gorm.DB {
        if page == 0 {
            page = 1
        }
        switch {
            case pageSize > 100:
                pageSize = 100
            case pageSize <= 0:
                pageSize=10
        }
        offset :=( page - 1 ) * pageSize
        return db.Offset(offset).Limit(pageSize)
    }
}
/**
排序判断
 */
func Order(sort string) func(db *gorm.DB) *gorm.DB {
    return func (db *gorm.DB) *gorm.DB {
        // 判断字符串第一个字符是 + -
        mark := sort[0:1]
        orderStr := sort[1:]
        switch {
            case mark == "-":
                orderStr =orderStr+` ASC`
            default:
                orderStr =orderStr+` DESC`
        }
        return db.Order(orderStr)
    }
}
/**
where查询
 */
func Where(wheres map[string]map[string]string) func(db *gorm.DB) *gorm.DB {
    var andWhere, orWhere = map[string]interface{}{}, map[string]interface{}{}
    var likeWhere string
    for key,value := range wheres {
        //组装where
        if key=="AND" {
            for key2,value2 := range value {
                andWhere[key2]=value2
            }
        }
        if key=="OR" {
            for key2,value2 := range value {
                orWhere[key2]=value2
            }
        }
        if key=="LIKE" {
            for key2,value2 := range value {
                likeWhere +=key2+` LIKE "`+value2+`%" OR `
            }
            // 去除尾部OR
            likeWhere = likeWhere[:len(likeWhere)-3]
        }
    }
    return func (db *gorm.DB) *gorm.DB {
        return db.Where(andWhere).Where(likeWhere).Or(orWhere)
    }
}

  Go的文档相对PHP并不多,自己也做个记录,方便有需要的人可以借鉴参考

posted @ 2022-07-29 17:25  雷江生  阅读(5356)  评论(0编辑  收藏  举报