gorm的callbacks实现SQL错误监控
本帖最后由 lswwyp 于 2023-7-5 16:36 编辑CallbacksGORM 自身也是基于 Callbacks 的,包括 Create、Query、Update、Delete、Row、Raw。此外,您也完全可以根据自己的意愿自定义 GORM回调会注册到全局 gorm.DB,而不是会话级别。如果您想要 gorm.DB 具有不同的回调,您需要初始化另一个 *gorm.DB注册带顺序的 Callback// gorm:create 之前
db.Callback().Create().Before("gorm:create").Register("update_created_at", updateCreated)
// gorm:create 之后
db.Callback().Create().After("gorm:create").Register("update_created_at", updateCreated)
// gorm:query 之后
db.Callback().Query().After("gorm:query").Register("my_plugin:after_query", afterQuery)
// gorm:delete 之后
db.Callback().Delete().After("gorm:delete").Register("my_plugin:after_delete", afterDelete)
// gorm:update 之前
db.Callback().Update().Before("gorm:update").Register("my_plugin:before_update", beforeUpdate)
// 位于 gorm:before_create 之后 gorm:create 之前
db.Callback().Create().Before("gorm:create").After("gorm:before_create").Register("my_plugin:before_create", beforeCreate)
// 所有其它 callback 之前
db.Callback().Create().Before("*").Register("update_created_at", updateCreated)
// 所有其它 callback 之后
db.Callback().Create().After("*").Register("update_created_at", updateCreated)
编写统一方法实现错误处理回调// UnifiedErrorCallback gorm 统一错误处理回调
func UnifiedErrorCallback(db *gorm.DB, processors []string) {
for _, processor := range processors {
var processorName = fmt.Sprintf("gorm:%s", processor)
var p = db.Callback().Query()
switch processor {
case "create":
p = db.Callback().Create()
case "row":
p = db.Callback().Row()
case "query":
p = db.Callback().Query()
case "delete":
p = db.Callback().Delete()
case "raw":
p = db.Callback().Raw()
case "update":
p = db.Callback().Update()
default:
continue
}
_ = p.After(processorName).Register("gorm_plugin:"+processorName, gormErrorCallback)
}
}
// MySQL错误统一处理
func gormErrorCallback(db *gorm.DB) {
if db.Error != nil && !errors.Is(db.Error, gorm.ErrRecordNotFound) {
logs.Error("SQL错误:", db.Error, "\nSQL:", db.ToSQL(func(tx *gorm.DB) *gorm.DB {
return tx
}))
}
}
// 注册统一错误回调
utils.UnifiedErrorCallback(Db, []string{"query", "raw", "row", "create", "update"})
已get到新技能,感谢
页:
[1]