forked from mirror/gorm
When using the LogMode(true), the SQL produced during the log message, places the bounded variables in the wrong location, this is due to the fact that the current implementation splits the values with a regex similar to: ($\d+)|?.
That works well for ? placeholders because they should be replaced in order. However, the numeric placeholders should be replaced based on their value, for instance: SELECT name,last FROM contact WHERE name=$2 and age=$1 Should NOT be replaced in order, because it will yield an incorrectly formed SQL command, which is not very useful for debugging. Fixes issue: #1249
This commit is contained in:
parent
f26fa242cc
commit
7f328975cd
13
logger.go
13
logger.go
|
@ -13,7 +13,8 @@ import (
|
|||
|
||||
var (
|
||||
defaultLogger = Logger{log.New(os.Stdout, "\r\n", 0)}
|
||||
sqlRegexp = regexp.MustCompile(`(\$\d+)|\?`)
|
||||
sqlRegexp = regexp.MustCompile(`\?`)
|
||||
numericPlaceHolderRegexp = regexp.MustCompile(`\$\d+`)
|
||||
)
|
||||
|
||||
type logger interface {
|
||||
|
@ -71,6 +72,15 @@ func (logger Logger) Print(values ...interface{}) {
|
|||
}
|
||||
}
|
||||
|
||||
// differentiate between $n placeholders or else treat like ?
|
||||
if numericPlaceHolderRegexp.MatchString(values[3].(string)) {
|
||||
sql = values[3].(string)
|
||||
for index, value := range formattedValues {
|
||||
placeholder := fmt.Sprintf(`\$%d`, index+1)
|
||||
subre := regexp.MustCompile(placeholder)
|
||||
sql = subre.ReplaceAllString(sql, value)
|
||||
}
|
||||
} else {
|
||||
var formattedValuesLength = len(formattedValues)
|
||||
for index, value := range sqlRegexp.Split(values[3].(string), -1) {
|
||||
sql += value
|
||||
|
@ -78,6 +88,7 @@ func (logger Logger) Print(values ...interface{}) {
|
|||
sql += formattedValues[index]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
messages = append(messages, sql)
|
||||
} else {
|
||||
|
|
Loading…
Reference in New Issue