Golang之Gorm-v1

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().Error
			if 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
}

你可能感兴趣的:(Golang笔记,golang,Gorm)