diff --git a/callbacks.go b/callbacks.go index c060ea70..ebebf79d 100644 --- a/callbacks.go +++ b/callbacks.go @@ -132,7 +132,11 @@ func (p *processor) Execute(db *DB) *DB { if stmt.SQL.Len() > 0 { db.Logger.Trace(stmt.Context, curTime, func() (string, int64) { - return db.Dialector.Explain(stmt.SQL.String(), stmt.Vars...), db.RowsAffected + sql, vars := stmt.SQL.String(), stmt.Vars + if filter, ok := db.Logger.(ParamsFilter); ok { + sql, vars = filter.ParamsFilter(stmt.Context, stmt.SQL.String(), stmt.Vars...) + } + return db.Dialector.Explain(sql, vars...), db.RowsAffected }, db.Error) } diff --git a/gorm.go b/gorm.go index 89488b75..65c9e228 100644 --- a/gorm.go +++ b/gorm.go @@ -464,12 +464,12 @@ func (db *DB) Use(plugin Plugin) error { // ToSQL for generate SQL string. // -// db.ToSQL(func(tx *gorm.DB) *gorm.DB { -// return tx.Model(&User{}).Where(&User{Name: "foo", Age: 20}) -// .Limit(10).Offset(5) -// .Order("name ASC") -// .First(&User{}) -// }) +// db.ToSQL(func(tx *gorm.DB) *gorm.DB { +// return tx.Model(&User{}).Where(&User{Name: "foo", Age: 20}) +// .Limit(10).Offset(5) +// .Order("name ASC") +// .First(&User{}) +// }) func (db *DB) ToSQL(queryFn func(tx *DB) *DB) string { tx := queryFn(db.Session(&Session{DryRun: true, SkipDefaultTransaction: true})) stmt := tx.Statement diff --git a/interfaces.go b/interfaces.go index 32d49605..cf9e07b9 100644 --- a/interfaces.go +++ b/interfaces.go @@ -26,6 +26,10 @@ type Plugin interface { Initialize(*DB) error } +type ParamsFilter interface { + ParamsFilter(ctx context.Context, sql string, params ...interface{}) (string, []interface{}) +} + // ConnPool db conns pool interface type ConnPool interface { PrepareContext(ctx context.Context, query string) (*sql.Stmt, error) diff --git a/logger/logger.go b/logger/logger.go index ce088561..29027205 100644 --- a/logger/logger.go +++ b/logger/logger.go @@ -55,6 +55,7 @@ type Config struct { SlowThreshold time.Duration Colorful bool IgnoreRecordNotFoundError bool + ParameterizedQueries bool LogLevel LogLevel } @@ -75,6 +76,7 @@ var ( SlowThreshold: 200 * time.Millisecond, LogLevel: Warn, IgnoreRecordNotFoundError: false, + ParameterizedQueries: true, Colorful: true, }) // Recorder Recorder logger records running SQL into a recorder instance @@ -181,6 +183,14 @@ func (l logger) Trace(ctx context.Context, begin time.Time, fc func() (string, i } } +// Trace print sql message +func (l logger) ParamsFilter(ctx context.Context, sql string, params ...interface{}) (string, []interface{}) { + if l.Config.ParameterizedQueries { + return sql, nil + } + return sql, params +} + type traceRecorder struct { Interface BeginAt time.Time diff --git a/tests/go.mod b/tests/go.mod index 23fc2cad..3929b334 100644 --- a/tests/go.mod +++ b/tests/go.mod @@ -3,11 +3,14 @@ module gorm.io/gorm/tests go 1.16 require ( + github.com/go-sql-driver/mysql v1.7.0 // indirect github.com/google/uuid v1.3.0 + github.com/jackc/pgtype v1.13.0 // indirect github.com/jinzhu/now v1.1.5 github.com/lib/pq v1.10.7 github.com/mattn/go-sqlite3 v1.14.16 // indirect - golang.org/x/crypto v0.3.0 // indirect + github.com/microsoft/go-mssqldb v0.19.0 // indirect + golang.org/x/crypto v0.4.0 // indirect gorm.io/driver/mysql v1.4.4 gorm.io/driver/postgres v1.4.5 gorm.io/driver/sqlite v1.4.3