假设您不想使用服务器日志记录功能,显而易见的解决方案是在进行所有查询时简单地记录它们。
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,)
显然,您可以通过添加错误报告,查询持续时间等来再次完善此设计。



