代码改变世界

golang gorm使用

  youxin  阅读(471)  评论(0编辑  收藏  举报

 

gorm链式操作:

Method Chaining,Gorm 实现了链式操作接口,所以你可以把代码写成这样:

 
复制代码
// 创建一个查询
tx := db.Where("name = ?", "jinzhu")
// 添加更多条件
if someCondition {
 tx = tx.Where("age = ?", 20)
} else {
 tx = tx.Where("age = ?", 30)
}
if yetAnotherCondition {
 tx = tx.Where("active = ?", 1)
}
复制代码

 

对于复杂的查询,例如多表连接查询,我们可以直接编写sql语句,然后执行sql语句。
gorm通过db.Raw设置sql语句,通过Scan执行查询。
例子:
sql := "SELECT type, count(*) as total FROM `foods` where create_time > ? GROUP BY type HAVING (total > 0)"
//因为sql语句使用了一个问号(?)作为绑定参数, 所以需要传递一个绑定参数(Raw第二个参数).
 //Raw函数支持绑定多个参数
db.Raw(sql, "2018-11-06 00:00:00").Scan(&results)
fmt.Println(results)
 
 
复制代码
var db *gorm.DB  // 已经进行了db的初始化操作,db为全局变量
func getUsers(c *gin.Context) {
  users := make([]User, 0)
  Db := db   
  if age, isExist := c.GetQuery("age"); isExist == true {
    ageInt, _ := strconv.Atoi(age)
    Db = Db.Where("age = ?", ageInt)
  }
  if num, isExist := c.GetQuery("num"); isExist == true {
    numInt, _ := strconv.Atoi(num)
    Db = Db.Where("num = ?", numInt)
  }
  if name, isExist := c.GetQuery("name"); isExist == true {
    Db = Db.Where("name = ?", name)
  }
  if err := Db.Find(&users).Error; err != nil {
    fmt.Println(err.Error())
  }
  c.JSON(http.StatusOK, gin.H{
    "data": users,
  })
}
复制代码

这里需要注意一个细节,首先将全局的db变量赋值给了Db,如果用db直接进行操作,那一系列的赋值语句将会影响db的地址,影响后续的数据库操作.

Db := db

https://www.jb51.net/article/202475.htm

 

类似 PHP的laravel框架就提供了这个便捷,比如$condition[] = ["age",">",20],

复制代码
func BuildCondition(where map[string]interface{}) (whereSql string,
    values []interface{}, err error) {
    for key, value := range where {
        conditionKey := strings.Split(key, " ")
        if len(conditionKey) > 2 {
            return "", nil, fmt.Errorf("" +
                "map构建的条件格式不对,类似于'age >'")
        }
        if whereSql != "" {
            whereSql += " AND "
        }
        switch len(conditionKey) {
        case 1:
            whereSql += fmt.Sprint(conditionKey[0], " = ?")
            values = append(values, value)
            break
        case 2:
            field := conditionKey[0]
            switch conditionKey[1] {
            case "=":
                whereSql += fmt.Sprint(field, " = ?")
                values = append(values, value)
                break
            case ">":
                whereSql += fmt.Sprint(field, " > ?")
                values = append(values, value)
                break
            case ">=":
                whereSql += fmt.Sprint(field, " >= ?")
                values = append(values, value)
                break
            case "<":
                whereSql += fmt.Sprint(field, " < ?")
                values = append(values, value)
                break
            case "<=":
                whereSql += fmt.Sprint(field, " <= ?")
                values = append(values, value)
                break
            case "in":
                whereSql += fmt.Sprint(field, " in (?)")
                values = append(values, value)
                break
            case "like":
                whereSql += fmt.Sprint(field, " like ?")
                values = append(values, value)
                break
            case "<>":
                whereSql += fmt.Sprint(field, " != ?")
                values = append(values, value)
                break
            case "!=":
                whereSql += fmt.Sprint(field, " != ?")
                values = append(values, value)
                break
            }
            break
        }
    }
    return
}
复制代码

 

目前这种实现方法利用了map来实现,但是还有一种方法可以实现,仿照php的laravel框架实现形式利用切片的形式也是可以实现的,这种实现方法和这种类似,我就不实现了。

具体的用法如下所示:

conditionString, values, _ := tool.BuildCondition(map[string]interface{}{
        "itemNO":        "02WZ05133",
        "itemName like": "%22220",
        "id in":         []int{20, 19, 30},
        "num !=" : 20,
    })
var student model.Student
db.where(conditionString,values).Find(&student)

以上就是拼接sql条件的构建。


https://blog.csdn.net/qq_28053177/article/details/82187821
链接:https://www.jianshu.com/p/09eea18e33c1/
github.com/goal-web/querybuilder

 https://www.yht7.com/news/84575

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
历史上的今天:
2014-12-02 gearman mysql持久化
2014-12-02 gearman安装及初次使用
2014-12-02 消息队列各种比较
2012-12-02 转:JTable添加单元格改变事件
2012-12-02 java Object和int,String转换
2012-12-02 JAVA中vector的remove和removeelementat这两个方法有什么区别?
2012-12-02 java vector 使用
点击右上角即可分享
微信分享提示