mysql有没有go语句_如何从Go / MySQL中记录所有传出的SQL语句?

sqlx以以下接口的形式有一个非常有趣的抽象:

它们在整个库中用作表示将字符串用作SQL查询的功能的接口.

例如:

db, err := sqlx.Connect("postgres", "user=foo dbname=bar sslmode=disable")

if err != nil {

log.Fatalln(err)

}

// exec the schema or fail; multi-statement Exec behavior varies between

// database drivers; pq will exec them all, sqlite3 won't, ymmv

db.MustExec("CREATE TABLE person (first_name text)")

最后一行实际上相当于:

sqlx.MustExec(db, "CREATE TABLE person (first_name text)")

db用作Execer的位置.

同样,这:

people := []Person{}

db.Select(&people, "SELECT * FROM person ORDER BY first_name ASC")

相当于:

sqlx.Select(db, &people, "SELECT * FROM person ORDER BY first_name ASC")

其中db用作查询器.

因此,如果您不想直接使用DB类型,而是使用库的基础自由函数,则可以使用以下结构将db包装到执行日志记录的对象中:

type QueryLogger struct {

queryer sqlx.Queryer

logger *log.Logger

}

func (p *QueryLogger) Query(query string, args ...interface{}) (*sql.Rows, error) {

p.logger.Print(query, args...)

return p.queryer.Query(query, args...)

}

func (p *QueryLogger) Queryx(query string, args ...interface{}) (*Rows, error) {

p.logger.Print(query, args...)

return p.queryer.Queryx(query, args...)

}

func (p *QueryLogger) QueryRowx(query string, args ...interface{}) *Row {

p.logger.Print(query, args...)

return p.queryer.QueryRowx(query, args...)

}

当连接到您的数据库时:

db, err := sqlx.Connect("postgres", "user=foo dbname=bar sslmode=disable")

if err != nil {

log.Fatalln(err)

}

ql := &QueryLogger{db, yourLogger}

sqlx.Select(ql, &people, "SELECT * FROM person ORDER BY first_name ASC")

当然这仅在使用sqlx库的自由函数时才有效,因此如果您的代码使用sqlx.DB类型进行大量调用,这可能不够方便.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值