From ad2dae1732a5ee45a094d35d8c1ca2ab71aa3cd3 Mon Sep 17 00:00:00 2001 From: clinyong Date: Tue, 15 Sep 2015 10:52:47 +0800 Subject: [PATCH] print more readable sql statement --- engine.go | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/engine.go b/engine.go index 4081ec14..d6cfa8a7 100644 --- a/engine.go +++ b/engine.go @@ -8,12 +8,14 @@ import ( "bufio" "bytes" "database/sql" + "database/sql/driver" "encoding/gob" "errors" "fmt" "io" "os" "reflect" + "regexp" "strconv" "strings" "sync" @@ -51,6 +53,8 @@ type Engine struct { disableGlobalCache bool } +var sqlRegexp = regexp.MustCompile(`(\$\d+)|\?`) + func (engine *Engine) SetLogger(logger core.ILogger) { engine.Logger = logger engine.dialect.SetLogger(logger) @@ -197,10 +201,34 @@ func (engine *Engine) logSQL(sqlStr string, sqlArgs ...interface{}) { if engine.ShowSQL { engine.overrideLogLevel(core.LOG_INFO) if len(sqlArgs) > 0 { - engine.Logger.Infof("[sql] %v [args] %v", sqlStr, sqlArgs) - } else { - engine.Logger.Infof("[sql] %v", sqlStr) + // format sql args + var formatedSqlArgs []interface{} + for _, value := range sqlArgs { + indirectValue := reflect.Indirect(reflect.ValueOf(value)) + if indirectValue.IsValid() { + value = indirectValue.Interface() + if t, ok := value.(time.Time); ok { + formatedSqlArgs = append(formatedSqlArgs, fmt.Sprintf("'%v'", t.Format(time.RFC3339))) + } else if b, ok := value.([]byte); ok { + formatedSqlArgs = append(formatedSqlArgs, fmt.Sprintf("'%v'", string(b))) + } else if r, ok := value.(driver.Valuer); ok { + if value, err := r.Value(); err == nil && value != nil { + formatedSqlArgs = append(formatedSqlArgs, fmt.Sprintf("'%v'", value)) + } else { + formatedSqlArgs = append(formatedSqlArgs, "NULL") + } + } else { + formatedSqlArgs = append(formatedSqlArgs, fmt.Sprintf("'%v'", value)) + } + } else { + formatedSqlArgs = append(formatedSqlArgs, fmt.Sprintf("'%v'", value)) + } + } + + sqlStr = fmt.Sprintf(sqlRegexp.ReplaceAllString(sqlStr, "%v"), formatedSqlArgs...) } + + engine.Logger.Infof("[sql] %v", sqlStr) } }