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 返回错误
}
回调链扩展
可用回调点
| 操作类型 | 可用位置 |
|---|---|
| Create | Before/After: gorm:create, gorm:save_before, gorm:save_after |
| Query | Before/After: gorm:query, gorm:row, gorm:raw |
| Update | Before/After: gorm:update, gorm:save_before, gorm:save_after |
| Delete | Before/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
📝 发现内容有误?点击此处直接编辑