我正在尝试编写一个简单的数据库应用程序,该应用程序可以访问多个数据服务器,一些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
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, )
显然,您可以通过添加错误报告,查询持续时间等来再次完善此设计。