golang gorm使用
2022-12-02 21:03 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需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 使用