SQL Hook 是一个轻量级的 Go 语言 SQL 拦截器库,允许开发者在不修改现有代码的情况下拦截和处理 SQL 查询。
- 无侵入式设计:不需要修改现有的数据库操作代码
- 支持多种数据库驱动
- 可以拦截查询、执行和预处理语句
- 简单易用的 API
go get github.com/eatmoreapple/sqlhook
package main
import (
"context"
"database/sql"
"database/sql/driver"
"log"
"github.com/eatmoreapple/sqlhook"
_ "github.com/go-sql-driver/mysql" // 导入需要的数据库驱动
)
func main() {
// 注册 SQL 钩子
sqlhook.Register(func(ctx context.Context, query string, args []driver.NamedValue) {
log.Printf("执行 SQL: %s, 参数: %v", query, args)
})
// 正常打开数据库连接
db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/dbname")
if err != nil {
log.Fatalf("连接数据库失败: %v", err)
}
defer db.Close()
// 所有的 SQL 操作都会被拦截和记录
db.Exec("INSERT INTO users(name, age) VALUES(?, ?)", "张三", 25)
}
// 只为 MySQL 驱动注册钩子
sqlhook.Register(myHandler, sqlhook.WithDriver("mysql"))
// 为多个驱动注册钩子
sqlhook.Register(myHandler,
sqlhook.WithDriver("mysql"),
sqlhook.WithDriver("postgres")
)
sqlhook.Register(func (ctx context.Context, query string, args []driver.NamedValue) {
// 从上下文中获取用户信息
userID := ctx.Value("user_id")
// 记录谁执行了什么查询
log.Printf("用户 %v 执行查询: %s", userID, query)
})