lswwyp 发表于 2023-7-5 16:34

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"})

小想哟 发表于 2023-7-6 02:54

已get到新技能,感谢
页: [1]
查看完整版本: gorm的callbacks实现SQL错误监控