gorm
文档:https://learnku.com/docs/gorm/v2/transactions/9745
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)
http://t.zoukankan.com/yingger-p-13392657.html