gpt4 book ai didi

sql - 如何将查询记录到数据库驱动程序?

转载 作者:IT王子 更新时间:2023-10-29 02:24:01 25 4
gpt4 key购买 nike

我正在尝试用 go 编写一个简单的数据库应用程序,它访问多个数据服务器,一些 MySQL、MSSQL 和 SqlLite3。我正在使用“数据库/sql”包来访问它们。

db, err := sql.Open(driver, dataSourceName)
result, err := db.Exec(
"INSERT INTO users (name, age) VALUES (?, ?)",
"gopher",
27,
)

我需要将 SQL 查询记录到各个服务器以进行调试和审计。我怎样才能做到这一点?

最佳答案

假设您不想使用服务器日志记录工具,显而易见的解决方案是简单地记录所有查询。

db, err := sql.Open(driver, dataSourceName)
log.Println(dataSourceName, "INSERT INTO users (name, age) VALUES (?, ?)", "gopher", 27)
result, err := db.Exec(
"INSERT INTO users (name, age) VALUES (?, ?)",
"gopher",
27,
)

这是您问题的基本解决方案。您可以通过多种方式对其进行优化:

  • 专门为您的查询创建一个log.Logger,这样您就可以将它定向到特定的输出目的地
  • 将所述 log.Loggersql.DB 对象包装在一个特殊的结构中,该结构将在查询完成时记录它们

这是上述结构的粗略示例:

type DB struct {
db *sql.DB
dsn string
log *log.Logger
}

func NewDB(driver, dsn string, log *log.Logger) (*DB, error) {
db, err := sql.Open(driver, dsn)
if err != nil {
return nil, err
}

return &DB {
db: db,
dsn: dsn,
log: log,
}
}

func (d DB) Exec(query string, args ...interface{}) (sql.Result, err) {
d.log.Println(dsn, query, args)
return d.db.Exec(query, args...)
}

以及您将如何使用它:

l := log.New(os.Stdout, "[sql]", log.LstdFlags)

db, _ := NewDB(driver, dataSourceName, l)
result, _ := db.Exec(
"INSERT INTO users (name, age) VALUES (?, ?)",
"gopher",
27,
)

显然,您可以通过添加错误报告、查询持续时间等再次改进此设计。

关于sql - 如何将查询记录到数据库驱动程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29270501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com