如何将查询记录到数据库驱动程序?
How to log queries to database drivers?
我正在尝试用 go 编写一个简单的数据库应用程序,它访问多个数据服务器,一些 MySQL、MSSQL 和 SqlLite3。
我正在使用“database/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.Logger
和 sql.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,
)
显然,您可以通过添加错误报告、查询持续时间等再次改进此设计
我正在尝试用 go 编写一个简单的数据库应用程序,它访问多个数据服务器,一些 MySQL、MSSQL 和 SqlLite3。 我正在使用“database/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.Logger
和sql.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,
)
显然,您可以通过添加错误报告、查询持续时间等再次改进此设计