切换导航
{{systemName}}
{{ info.Title }}
{{info.Title}}
{{ menu.Title }}
{{menu.Title}}
登录
|
退出
搜索
golang orm框架 gorm
作者:ych
gorm [官方文档](https://learnku.com/docs/gorm/v2/transactions/9745 "文档") orm最终都要转为底层的sql语句进行执行,就像我们所有的可视化拖动操作都可以使用命令来实现一样,底层就是命令的组合。 #### gorm执行原生sql 当有复杂sql语句的时候,我们需要执行原生sql语句,这样更加方便 比如下面的这条sql语句 ``` //查询每天条数 type EveryDayNum struct { Day string `json:"day"` Num int64 `json:"num"` } func CountVisitorsEveryDay(toId string) []EveryDayNum { var results []EveryDayNum DB.Raw("select DATE_FORMAT(updated_at,'%Y-%m-%d') as day ,"+ "count(*) as num from visitor where to_id=? group by day order by day desc limit 30", toId).Scan(&results) return results } ``` 只需要拿着数据库对象去.Raw(原生sql).Scan()就可以了 Scan的参数是一个结构体引用,所以一定要定义好结构体接收数据才行。 原生的database/sql, queryRow返回的并不支持Scan结构,必须要一个个 赋值。上面的gorm是封装好的。 ##### 日志 Gorm有内置的日志记录器支持,默认情况下,它会打印发生的错误。 ``` // 启用Logger,显示详细日志 db.LogMode(true) // 禁用日志记录器,不显示任何日志 db.LogMode(false) // 调试单个操作,显示此操作的详细日志 db.Debug().Where("name = ?", "xiaoming").First(&User{}) ``` ##### 事务 使用db.Begin()来开启一个事务, 通过Commit()和Rollback()方法来关闭。 ``` tx := db.Begin() tx.Rollback() tx.Commit() ``` Exec, Query, QueryRow and Prepare 方法已经全部可以在tx上面使用。使用方法和在*sql.DB是一样的,事务必须以Commit()或者Rollback()结束 ##### The Connection Pool 在database/sql中有一个很基本的连接池,你并没有多大的控制权,仅仅可以设置SetMaxIdleConns和SetMaxOpenConns,也就是最大空闲连接和最大连接数。 ``` db.SetMaxIdleConns(n) db.SetMaxOpenConns(n) ``` ``` // 关于Gorm执行原生SQL // **********语句字段要小写************ // ***********查询用db.Raw,其他用db.Exec // *********** 字段大小写要对应上 ************** // *************** 注意要 defer rows.Close() var Mycount Mycount rows,_:= db.Debug().Raw("select Count(1) as Usercount from Users").Rows() defer rows.Close() for rows.Next() { rows.Scan(&Mycount.Usercount) } var users []User // 查询 执行用Scan 和Find 一样 db=db.Raw("select uid,user_name,age from Users").Scan(&users) //db=db.Raw("select uid,user_name,age from Users").Find(&users) fmt.Println("Users",users) // 更新和删除.插入用 Exec db= db.Exec("update Users set user_name='def' where uid=?",1) fmt.Println("更新了",db.RowsAffected,"条数据") db= db.Exec("delete from Users where uid=?",2) fmt.Println("更新了",db.RowsAffected,"条数据") return int32(Mycount.Usercount) ```
相关推荐
golang 中解析 tag 是怎么实现的?反射原理是什么?(中高级肯定会问,比较难,需要自己多去总结)
使用gorm不当出现too Many Connections的问题
golang map 使用注意的点,是否并发安全?
uint 类型溢出问题
讲讲 Go 的 select 底层数据结构和一些特性?(难点,没有项目经常可能说不清,面试一般会问你项目中怎么使用select)
golang进行封包和拆包的完整解决方案
对已经关闭的 chan 进行读写,会怎么样?为什么?
调用函数传入结构体时,应该传值还是指针? (Golang 都是传值)
为 sync.WaitGroup 中Wait函数支持 WaitTimeout 功能.
讲讲 Go 的 defer 底层数据结构和一些特性?
Golang空结构体 struct{} 的使用
go defer,多个 defer 的顺序,defer 在什么时机会修改返回值?
Golang 单引号,双引号,反引号的区别?
序列化协议
Golang表示枚举类型的详细讲解
昨天那个在for循环里append元素的同事,今天还在么?
golang并发题目测试
交替打印数字和字母
golang面试题
for range 的时候它的地址会发生变化么?
数组和切片的区别 (基本必问)
实现阻塞读且并发安全的map
机器人坐标问题
复利计算 递归/非递归
在 golang 协程和channel配合使用
写出以下逻辑,要求每秒钟调用一次proc并保证程序不退出?
讲讲 Go 的 slice 底层数据结构和一些特性?
高并发下的锁与map的读写
判断两个给定的字符串排序后是否一致
常见语法题目2
字符串替换问题
常见语法题目1
golang 中 make 和 new 的区别?(基本必问)
七道语法找错题目
判断字符串中字符是否全都不同
golang 实现一个负载均衡案例(随机,轮训)
基本数据结构和算法
操作系统基本原理
翻转字符串
评论区
先去登录
版权所有:机遇屋在线 Copyright © 2021-2025 jiyuwu Co., Ltd.
鲁ICP备16042261号-1