Golang之Gorm-v1
创始人
2024-03-30 08:14:38
0

1、简介

github.com/jinzhu/gorm 是Gorm v1的地址;
gorm.io/gorm 是Gorm v2的地址;

在Gorm v2在v1的基础上 进行了性能优化;事务支持save point, rollback saved point; 支持数据库的读写分离,可参考更新日志 | 高级主题 |《GORM 中文文档 v2》| Go 技术论坛

2、连接配置

SetMaxOpenConns 客户端最大连接数;

SetMaxIdleConns 最大空闲可复用连接数,即可用连接池的大小,再多的空闲连接就会被杀死,保留空闲连接是为了复用连接,不然每次执行sql都会重新建立新的连接;

SetConnMaxLifetime 连接最长持续时间,从连接建立开始计算,默认时间为永久不过期;

SetConnMaxIdleTime 连接最长空闲时间,从连接空闲开始计算,默认时间为永久不过期,一般要小于SetConnMaxLifetime;

打开的连接 = 正在使用的连接(inuse) + 处于空闲状态的连接(idle),同时如果各个客户端未释放的连接数已经达到 MySQL 的上限,就会报错 "Can not connect to MySQL server. Too many connections"

3、Gorm链式操作

创建方法才是那些会产生 SQL 查询并且发送到数据库,通常它就是一些 CRUD 方法, 比如:Create, First, Find, Take, Save, UpdateXXX, Delete, Scan, Row, Rows。所有的链式操作都将会克隆并创建一个新的数据库连接,所以GORM 对于多个 goroutines 的并发使用是安全的。

4、Gorm生命周期钩子

// 开启事务
BeforeSave
BeforeCreate
// 连表前的保存
// 更新时间戳 `CreatedAt`, `UpdatedAt`
// 保存自己
// 重载哪些有默认值和空的字段
// 链表后的保存
AfterCreate
AfterSave
// 提交或回滚事务

5、Gorm事务

事务模板

// 开启事务
tx := db.Begin()// 在事务中执行一些数据库操作 (从这里开始使用 'tx',而不是 'db')
tx.Create(...)// ...// 发生错误回滚事务
tx.Rollback()// 或者提交这个事务
tx.Commit()

事务例子一

func CreateAnimals(db *gorm.DB) err {// 注意在事务中要使用 tx 作为数据库句柄tx := db.Begin()defer func() {if r := recover(); r != nil {tx.Rollback()}}()if tx.Error != nil {return err}if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {tx.Rollback()return err}if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {tx.Rollback()return err}return tx.Commit().Error
}

事务例子二

func (m *Manager) TransactionHandle(callback func(db *gorm.DB) error) (err error) {tx := m.Begin()defer func() {if r := recover(); r != nil {klog.Errorf("Unexpected panic occurred, rollback transaction: %v", r)err = fmt.Errorf("%v", r)}if err != nil {rollBackErr := tx.Rollback().Errorif rollBackErr == nil {err = fmt.Errorf("callback err : (%s) , rollBack success", err.Error())} else {err = fmt.Errorf("callback err : (%s) , rollBack err : (%s) ", err.Error(), rollBackErr.Error())}} else {if err = tx.Commit().Error; err != nil {err = fmt.Errorf("commit err : (%s)", err.Error())}}}()err = callback(tx)return err
}

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...