全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-21 5 分钟 ✍️ juanwangdev

GORM 插件注册与使用

GORM 提供灵活的插件系统,通过 Use 方法可将自定义功能集成到 ORM 回调链中。

插件系统概述

什么是插件

GORM 插件是实现了 gorm.Plugin 接口的结构体,可在查询执行前后注入自定义逻辑。

核心接口

Go
type Plugin interface {
    Name() string
    Initialize(*DB) error
}

插件注册

使用 Use 方法

Go
// 注册内置插件
db.Use(prometheus.New(prometheus.Config{
    DBName:          "gorm",
    RefreshInterval: 15,
}))

// 注册自定义插件
db.Use(&MyPlugin{})

插件执行时机

插件在 GORM 回调链中按注册顺序执行,可拦截 CRUD 操作。

自定义插件开发

实现 Plugin 接口

Go
type MyPlugin struct{}

func (p *MyPlugin) Name() string {
    return "my:plugin"
}

func (p *MyPlugin) Initialize(db *gorm.DB) error {
    // 注册回调函数
    db.Callback().Create().After("gorm:create").Register("my:create", myCreateHandler)
    db.Callback().Query().Before("gorm:query").Register("my:query", myQueryHandler)
    return nil
}

回调函数签名

Go
func myQueryHandler(db *gorm.DB) {
    // 访问 db.Statement 获取查询信息
    // 修改 db.Statement.Conditions 添加条件
    // 设置 db.Error 返回错误
}

回调链扩展

可用回调点

操作类型可用位置
CreateBefore/After: gorm:create, gorm:save_before, gorm:save_after
QueryBefore/After: gorm:query, gorm:row, gorm:raw
UpdateBefore/After: gorm:update, gorm:save_before, gorm:save_after
DeleteBefore/After: gorm:delete, gorm:save_before, gorm:save_after

注册示例

Go
// 在查询前添加逻辑
db.Callback().Query().Before("gorm:query").Register("my:plugin:query", func(db *gorm.DB) {
    log.Printf("Executing query: %s", db.Statement.SQL.String())
})

注意事项

插件注册必须在 db.Use() 之前完成,且每个插件的 Name() 返回值必须全局唯一。

回调函数中避免执行耗时操作,以免阻塞主查询流程。

使用 db.Statement 时注意检查 nil 情况,避免空指针异常。

要点总结

  • GORM 插件通过实现 Plugin 接口完成开发
  • db.Use() 方法用于注册插件到回调链
  • 回调函数可按需挂载到 Create/Query/Update/Delete 各阶段
  • 插件名称必须唯一,回调执行顺序按注册先后
  • 自定义插件可灵活扩展 GORM 功能,实现审计、缓存、监控等需求

存放路径:D:\git2\jwdev\articles\GORM\进阶\插件系统\插件注册与使用.md

📝 发现内容有误?点击此处直接编辑

← 上一篇 GORM Prometheus 监控插件
下一篇 → GORM DeletedAt 字段使用
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库