gpt4 book ai didi

mysql - 如何记录所有来自 Go/MySQL 的传出 SQL 语句?

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

我正在使用非框架 Go 堆栈 sqlx , 和 MySQL对于一个网络项目。

我想记录所有传出的 SQL 语句以进行调试。是否有可能做到这一点?希望得到这样的输出(从 Rails 项目复制):

  User Load (94.4ms)  SELECT `users`.* FROM `users` WHERE `users`.`login` = 'bondnewyork' LIMIT 1
User Load (16.3ms) SELECT `users`.* FROM `users` WHERE `users`.`login` = 'mkovarik' LIMIT 1
User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`login` = 'mkovarik' LIMIT 1
User Load (0.3ms) SELECT `users`.* FROM `users` ORDER BY `users`.`id` DESC LIMIT 1
User Load (0.4ms) SELECT `users`.* FROM `users` ORDER BY `users`.`id` DESC LIMIT 1

最佳答案

sqlx 具有以下接口(interface)形式的非常有趣的抽象:

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

例如:

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 用作 Queryer

所以如果你不愿意直接使用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 类型的调用,这可能不够方便。

关于mysql - 如何记录所有来自 Go/MySQL 的传出 SQL 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33041063/

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