golang gorm 访问底层mysql查询

问题描述 投票:0回答:4

有没有办法从https://github.com/jinzhu/gorm获取sql查询日志?

例如在开发环境中,能够将已调用的 mysql 查询记录到控制台会很有用。

例如如何获取以下查询的底层sql查询日志:

gorm.Find(&todos)
gorm.Preload("User").Find(&todos)

我知道我可以致电:

gorm.Debug().Find(&todos)
gorm.Debug().Preload("User").Find(&todos)

但我只想在开发环境中而非生产环境中调用

Debug()

mysql logging go go-gorm
4个回答
63
投票

这就能解决问题:

db, err:= Open(dbType, connectionDSN);
db.LogMode(true)

52
投票

在新版本(GORM v2)中,使用

Logger
界面:

import "gorm.io/gorm/logger"


db, err := gorm.Open(mysql.Open(connectionDSN), &gorm.Config{
    Logger: logger.Default.LogMode(logger.Info),
})

对于旧版本(GORM v1):

db, err:= Open(dbType, connectionDSN);
db.LogMode(true)

注意:这并非特定于 MySQL,并且可以与任何其他数据库驱动程序(例如 Postgres、SQLite 等)一起使用。


1
投票

您可以使用 gorm.SetLogger 方法将自己的记录器传递给 gorm。它使用记录器的 Print 方法来打印日志以及 SQL 查询。任何记录器(logrus/go 的内置记录器)的 Print 方法的日志级别通常设置为 INFO。将记录器传递给 gorm 时,如果将日志级别设置为低于或等于 INFO(DEBUG/INFO),您可以通过 gorm 看到 sql 查询和其他日志

您还可以从配置文件中解析日志级别,您可以根据环境进行设置


0
投票

您可以使用原生

db.ToSQL
方法直接以字符串形式获取查询

query := dbcon
query = query.Where("name = ?", "John").Limit(10).Offset(5).Order("name ASC")

queryString := dbcon.ToSQL(func(tx *gorm.DB) *gorm.DB) {
  var users []User{}
  return tx.Find(&user)
})
fmt.Println("The query is ", queryString)

哪个输出

The query is 'SELECT * FROM `users` WHERE name = "John" AND `users`.`deleted_at` IS NULL ORDER BY name ASC LIMIT 10 OFFSET 5'
© www.soinside.com 2019 - 2024. All rights reserved.