golang gorm Access the underlying mysql query
Asked Answered
T

4

58

Is there a way to get the sql query log from https://github.com/jinzhu/gorm?

e.g. in dev environment, it would be useful to be able to log to the console the mysql queries that have been called.

e.g. how to get the underlying sql query log for the following queries:

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

I am aware that I can call:

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

but I would like to only call Debug() if in dev envrionment and not in production

Ten answered 29/3, 2016 at 10:14 Comment(0)
T
56

In the new version (GORM v2), use the Logger interface:

import "gorm.io/gorm/logger"


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

For old version (GORM v1):

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

Note: this is not specific to MySQL and will work with any other DB driver (e.g. Postgres, SQLite, etc.).

Topical answered 25/2, 2021 at 11:52 Comment(0)
L
63

This will do the trick:

db, err:= Open(dbType, connectionDSN);
db.LogMode(true)
Laic answered 29/3, 2016 at 11:39 Comment(0)
T
56

In the new version (GORM v2), use the Logger interface:

import "gorm.io/gorm/logger"


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

For old version (GORM v1):

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

Note: this is not specific to MySQL and will work with any other DB driver (e.g. Postgres, SQLite, etc.).

Topical answered 25/2, 2021 at 11:52 Comment(0)
I
1

You can pass your own logger to gorm using gorm.SetLogger method. It uses the Print method of the logger to print logs as well as SQL queries. The log level of Print method for any logger(logrus/go's inbuild logger) is generally set to INFO. While passing the logger to gorm, if you set the log level to anything below or equal to INFO(DEBUG/INFO) you can see the sql queries and other logs by gorm

Also you can parse the log level from a config file where you can set it based on environment

Interpol answered 29/3, 2016 at 10:22 Comment(0)
A
0

You can use native db.ToSQL method to get the query directly as a string

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)

Which outputs

The query is 'SELECT * FROM `users` WHERE name = "John" AND `users`.`deleted_at` IS NULL ORDER BY name ASC LIMIT 10 OFFSET 5'
Addington answered 3/6 at 23:8 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.