orm hook和session
gorm hook
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 session
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)}