Skip to content

eatmoreapple/sqlhook

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SQL Hook

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

用例

SQL 查询审计日志

sqlhook.Register(func (ctx context.Context, query string, args []driver.NamedValue) {
    // 从上下文中获取用户信息
    userID := ctx.Value("user_id")
    
    // 记录谁执行了什么查询
    log.Printf("用户 %v 执行查询: %s", userID, query)
})

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages