我希望在gorm执行某些sql语句时,如果发生异常,则将执行的SQL打印到日志中

我的代码如下示例

result := db.Find(&regionModels)
if err := result.Error; err != nil {
    log.Error(
        "Find err",
        zap.String("sql", result.Statement.SQL.String()),
        zap.Error(err),
    )
}

我通过阅读gorm的源码得知,当执行Find时,result.Statement.SQL会调用Reset方法清空内部的SQL语句。 因而,我得到的日志里不能正确的打印出SQL

The document you expected this should be explained

Expected answer

GORM是否提供了某函数可以返回build出的sql?

Comment From: ivila

你用的是哪个版本的gorm?这个一直都是有的,你看看自定义Logger那里,https://gorm.io/docs/logger.html 注意看那个Trace方法,你可以搞个自定义的Logger(内部使用zap来打日志),然后实现Trace方法的时候,在err时打印出来。 具体样例可以参照gorm的默认Logger实现:https://github.com/go-gorm/gorm/blob/master/logger/logger.go @VarusHsu

Comment From: VarusHsu

你用的是哪个版本的gorm?这个一直都是有的,你看看自定义Logger那里,https://gorm.io/docs/logger.html 注意看那个Trace方法,你可以搞个自定义的Logger(内部使用zap来打日志),然后实现Trace方法的时候,在err时打印出来。 具体样例可以参照gorm的默认Logger实现:https://github.com/go-gorm/gorm/blob/master/logger/logger.go @VarusHsu

Your solution good for me. Thanks @ivila