mirror of https://github.com/go-gorm/gorm.git
Fix affected rows for Scan, change affected rows count for row/rows to '-', close #3532
This commit is contained in:
parent
ba253982bf
commit
9eec6ae066
|
@ -74,7 +74,6 @@ func (cs *callbacks) Raw() *processor {
|
||||||
func (p *processor) Execute(db *DB) {
|
func (p *processor) Execute(db *DB) {
|
||||||
curTime := time.Now()
|
curTime := time.Now()
|
||||||
stmt := db.Statement
|
stmt := db.Statement
|
||||||
db.RowsAffected = 0
|
|
||||||
|
|
||||||
if stmt.Model == nil {
|
if stmt.Model == nil {
|
||||||
stmt.Model = stmt.Dest
|
stmt.Model = stmt.Dest
|
||||||
|
|
|
@ -16,6 +16,8 @@ func RowQuery(db *gorm.DB) {
|
||||||
} else {
|
} else {
|
||||||
db.Statement.Dest = db.Statement.ConnPool.QueryRowContext(db.Statement.Context, db.Statement.SQL.String(), db.Statement.Vars...)
|
db.Statement.Dest = db.Statement.ConnPool.QueryRowContext(db.Statement.Context, db.Statement.SQL.String(), db.Statement.Vars...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
db.RowsAffected = -1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gorm.io/gorm/clause"
|
"gorm.io/gorm/clause"
|
||||||
|
"gorm.io/gorm/logger"
|
||||||
"gorm.io/gorm/schema"
|
"gorm.io/gorm/schema"
|
||||||
"gorm.io/gorm/utils"
|
"gorm.io/gorm/utils"
|
||||||
)
|
)
|
||||||
|
@ -353,7 +354,9 @@ func (db *DB) Rows() (*sql.Rows, error) {
|
||||||
|
|
||||||
// Scan scan value to a struct
|
// Scan scan value to a struct
|
||||||
func (db *DB) Scan(dest interface{}) (tx *DB) {
|
func (db *DB) Scan(dest interface{}) (tx *DB) {
|
||||||
|
currentLogger, newLogger := db.Logger, logger.Recorder.New()
|
||||||
tx = db.getInstance()
|
tx = db.getInstance()
|
||||||
|
tx.Logger = newLogger
|
||||||
if rows, err := tx.Rows(); err != nil {
|
if rows, err := tx.Rows(); err != nil {
|
||||||
tx.AddError(err)
|
tx.AddError(err)
|
||||||
} else {
|
} else {
|
||||||
|
@ -362,6 +365,11 @@ func (db *DB) Scan(dest interface{}) (tx *DB) {
|
||||||
tx.ScanRows(rows, dest)
|
tx.ScanRows(rows, dest)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
currentLogger.Trace(tx.Statement.Context, newLogger.BeginAt, func() (string, int64) {
|
||||||
|
return newLogger.SQL, tx.RowsAffected
|
||||||
|
}, tx.Error)
|
||||||
|
tx.Logger = currentLogger
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,7 @@ var (
|
||||||
LogLevel: Warn,
|
LogLevel: Warn,
|
||||||
Colorful: true,
|
Colorful: true,
|
||||||
})
|
})
|
||||||
|
Recorder = traceRecorder{Interface: Default}
|
||||||
)
|
)
|
||||||
|
|
||||||
func New(writer Writer, config Config) Interface {
|
func New(writer Writer, config Config) Interface {
|
||||||
|
@ -70,18 +71,18 @@ func New(writer Writer, config Config) Interface {
|
||||||
infoStr = "%s\n[info] "
|
infoStr = "%s\n[info] "
|
||||||
warnStr = "%s\n[warn] "
|
warnStr = "%s\n[warn] "
|
||||||
errStr = "%s\n[error] "
|
errStr = "%s\n[error] "
|
||||||
traceStr = "%s\n[%.3fms] [rows:%d] %s"
|
traceStr = "%s\n[%.3fms] [rows:%v] %s"
|
||||||
traceWarnStr = "%s\n[%.3fms] [rows:%d] %s"
|
traceWarnStr = "%s\n[%.3fms] [rows:%v] %s"
|
||||||
traceErrStr = "%s %s\n[%.3fms] [rows:%d] %s"
|
traceErrStr = "%s %s\n[%.3fms] [rows:%v] %s"
|
||||||
)
|
)
|
||||||
|
|
||||||
if config.Colorful {
|
if config.Colorful {
|
||||||
infoStr = Green + "%s\n" + Reset + Green + "[info] " + Reset
|
infoStr = Green + "%s\n" + Reset + Green + "[info] " + Reset
|
||||||
warnStr = BlueBold + "%s\n" + Reset + Magenta + "[warn] " + Reset
|
warnStr = BlueBold + "%s\n" + Reset + Magenta + "[warn] " + Reset
|
||||||
errStr = Magenta + "%s\n" + Reset + Red + "[error] " + Reset
|
errStr = Magenta + "%s\n" + Reset + Red + "[error] " + Reset
|
||||||
traceStr = Green + "%s\n" + Reset + Yellow + "[%.3fms] " + BlueBold + "[rows:%d]" + Reset + " %s"
|
traceStr = Green + "%s\n" + Reset + Yellow + "[%.3fms] " + BlueBold + "[rows:%v]" + Reset + " %s"
|
||||||
traceWarnStr = Green + "%s\n" + Reset + RedBold + "[%.3fms] " + Yellow + "[rows:%d]" + Magenta + " %s" + Reset
|
traceWarnStr = Green + "%s\n" + Reset + RedBold + "[%.3fms] " + Yellow + "[rows:%v]" + Magenta + " %s" + Reset
|
||||||
traceErrStr = RedBold + "%s " + MagentaBold + "%s\n" + Reset + Yellow + "[%.3fms] " + BlueBold + "[rows:%d]" + Reset + " %s"
|
traceErrStr = RedBold + "%s " + MagentaBold + "%s\n" + Reset + Yellow + "[%.3fms] " + BlueBold + "[rows:%v]" + Reset + " %s"
|
||||||
}
|
}
|
||||||
|
|
||||||
return &logger{
|
return &logger{
|
||||||
|
@ -138,13 +139,43 @@ func (l logger) Trace(ctx context.Context, begin time.Time, fc func() (string, i
|
||||||
switch {
|
switch {
|
||||||
case err != nil && l.LogLevel >= Error:
|
case err != nil && l.LogLevel >= Error:
|
||||||
sql, rows := fc()
|
sql, rows := fc()
|
||||||
|
if rows == -1 {
|
||||||
|
l.Printf(l.traceErrStr, utils.FileWithLineNum(), err, float64(elapsed.Nanoseconds())/1e6, "-", sql)
|
||||||
|
} else {
|
||||||
l.Printf(l.traceErrStr, utils.FileWithLineNum(), err, float64(elapsed.Nanoseconds())/1e6, rows, sql)
|
l.Printf(l.traceErrStr, utils.FileWithLineNum(), err, float64(elapsed.Nanoseconds())/1e6, rows, sql)
|
||||||
|
}
|
||||||
case elapsed > l.SlowThreshold && l.SlowThreshold != 0 && l.LogLevel >= Warn:
|
case elapsed > l.SlowThreshold && l.SlowThreshold != 0 && l.LogLevel >= Warn:
|
||||||
sql, rows := fc()
|
sql, rows := fc()
|
||||||
|
if rows == -1 {
|
||||||
|
l.Printf(l.traceWarnStr, utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, "-", sql)
|
||||||
|
} else {
|
||||||
l.Printf(l.traceWarnStr, utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, rows, sql)
|
l.Printf(l.traceWarnStr, utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, rows, sql)
|
||||||
|
}
|
||||||
case l.LogLevel >= Info:
|
case l.LogLevel >= Info:
|
||||||
sql, rows := fc()
|
sql, rows := fc()
|
||||||
|
if rows == -1 {
|
||||||
|
l.Printf(l.traceStr, utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, "-", sql)
|
||||||
|
} else {
|
||||||
l.Printf(l.traceStr, utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, rows, sql)
|
l.Printf(l.traceStr, utils.FileWithLineNum(), float64(elapsed.Nanoseconds())/1e6, rows, sql)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type traceRecorder struct {
|
||||||
|
Interface
|
||||||
|
BeginAt time.Time
|
||||||
|
SQL string
|
||||||
|
RowsAffected int64
|
||||||
|
Err error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l traceRecorder) New() *traceRecorder {
|
||||||
|
return &traceRecorder{Interface: l.Interface}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *traceRecorder) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) {
|
||||||
|
l.BeginAt = begin
|
||||||
|
l.SQL, l.RowsAffected = fc()
|
||||||
|
l.Err = err
|
||||||
}
|
}
|
||||||
|
|
1
scan.go
1
scan.go
|
@ -52,6 +52,7 @@ func scanIntoMap(mapValue map[string]interface{}, values []interface{}, columns
|
||||||
func Scan(rows *sql.Rows, db *DB, initialized bool) {
|
func Scan(rows *sql.Rows, db *DB, initialized bool) {
|
||||||
columns, _ := rows.Columns()
|
columns, _ := rows.Columns()
|
||||||
values := make([]interface{}, len(columns))
|
values := make([]interface{}, len(columns))
|
||||||
|
db.RowsAffected = 0
|
||||||
|
|
||||||
switch dest := db.Statement.Dest.(type) {
|
switch dest := db.Statement.Dest.(type) {
|
||||||
case map[string]interface{}, *map[string]interface{}:
|
case map[string]interface{}, *map[string]interface{}:
|
||||||
|
|
Loading…
Reference in New Issue