gorm提供了一些hook函数,在增删查改、事务操作前后执行。需要让model实现对应接口。hook函数的执行会先于gorm sql运行日志的打印。
// gorm 插入更新都会默认开启事务,如果业务无需开启,在设置中可以关闭
// 事务开始之前
func (t *Teacher) BeforeSave(tx *gorm.DB) error {
fmt.Println("hook BeforeSave")
return nil
}
// 事务结束之后,提交和回滚
func (t *Teacher) AfterSave(tx *gorm.DB) error {
fmt.Println("hook AfterSave")
return nil
}
// 插入前
func (t *Teacher) BeforeCreate(tx *gorm.DB) error {
fmt.Println("hook BeforeCreate")
return nil
}
// 插入后
func (t *Teacher) AfterCreate(tx *gorm.DB) error {
fmt.Println("hook AfterCreate")
return nil
}
// 更新前
func (t *Teacher) BeforeUpdate(tx *gorm.DB) error {
fmt.Println("hook BeforeUpdate")
return nil
}
// 更新后
func (t *Teacher) AfterUpdate(tx *gorm.DB) error {
fmt.Println("hook AfterUpdate")
return nil
}
// 删除前
func (t *Teacher) BeforeDelete(tx *gorm.DB) error {
fmt.Println("hook BeforeDelete")
return nil
}
// 删除后
func (t *Teacher) AfterDelete(tx *gorm.DB) error {
fmt.Println("hook AfterDelete")
return nil
}
// 查询后
func (t *Teacher) AfterFind(tx *gorm.DB) error {
fmt.Println("hook AfterFind")
return nil
}
gorm可以建立多个会话,每个会话配置互相独立,可以不同于全局的配置。在会话中可以进行特殊的配置达到业务/性能要求。
// 创建会话, 可以单独做一些配置(可以不同于全局配置)
func Session() {
tx := DB.Session(&gorm.Session{
//开启预编译
PrepareStmt: true,
//跳过钩子函数
SkipHooks: true,
//禁用嵌套事务
DisableNestedTransaction: true,
//允许全局更新
AllowGlobalUpdate: true,
// 设置日志级别
Logger: DB.Logger.LogMode(logger.Error),
})
t := Teacher{
Name: "yuan",
Age: 41,
Salary: 122345.123,
Email: "yuan@test.com",
}
tx.Create(&t)
fmt.Println(t)
}