吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 636|回复: 1
收起左侧

[学习记录] gorm的callbacks实现SQL错误监控

[复制链接]
lswwyp 发表于 2023-7-5 16:34
本帖最后由 lswwyp 于 2023-7-5 16:36 编辑

CallbacksGORM 自身也是基于 Callbacks 的,包括 Create、Query、Update、Delete、Row、Raw。此外,您也完全可以根据自己的意愿自定义 GORM回调会注册到全局 gorm.DB,而不是会话级别。如果您想要 gorm.DB 具有不同的回调,您需要初始化另一个 *gorm.DB注册带顺序的 Callback
[Golang] 纯文本查看 复制代码
// 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)

编写统一方法实现错误处理回调
[Golang] 纯文本查看 复制代码
// 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到新技能,感谢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 22:45

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表