refactor: better SQL logging

This commit is contained in:
Deluan
2020-02-01 15:06:49 -05:00
committed by Deluan Quintão
parent 7c4511e33a
commit b62b78edfe
+32 -20
View File
@@ -64,11 +64,13 @@ func (r sqlRepository) applyFilters(sq SelectBuilder, options ...model.QueryOpti
} }
func (r sqlRepository) executeSQL(sq Sqlizer) (int64, error) { func (r sqlRepository) executeSQL(sq Sqlizer) (int64, error) {
query, args, err := r.toSql(sq) query, args, err := sq.ToSql()
if err != nil { if err != nil {
return 0, err return 0, err
} }
res, err := r.ormer.Raw(query, args...).Exec() res, err := r.ormer.Raw(query, args...).Exec()
c, _ := res.RowsAffected()
r.logSQL(query, args, err, c)
if err != nil { if err != nil {
if err.Error() != "LastInsertId is not supported by this driver" { if err.Error() != "LastInsertId is not supported by this driver" {
return 0, err return 0, err
@@ -78,11 +80,12 @@ func (r sqlRepository) executeSQL(sq Sqlizer) (int64, error) {
} }
func (r sqlRepository) queryOne(sq Sqlizer, response interface{}) error { func (r sqlRepository) queryOne(sq Sqlizer, response interface{}) error {
query, args, err := r.toSql(sq) query, args, err := sq.ToSql()
if err != nil { if err != nil {
return err return err
} }
err = r.ormer.Raw(query, args...).QueryRow(response) err = r.ormer.Raw(query, args...).QueryRow(response)
r.logSQL(query, args, err, 1)
if err == orm.ErrNoRows { if err == orm.ErrNoRows {
return model.ErrNotFound return model.ErrNotFound
} }
@@ -90,11 +93,12 @@ func (r sqlRepository) queryOne(sq Sqlizer, response interface{}) error {
} }
func (r sqlRepository) queryAll(sq Sqlizer, response interface{}) error { func (r sqlRepository) queryAll(sq Sqlizer, response interface{}) error {
query, args, err := r.toSql(sq) query, args, err := sq.ToSql()
if err != nil { if err != nil {
return err return err
} }
_, err = r.ormer.Raw(query, args...).QueryRows(response) c, err := r.ormer.Raw(query, args...).QueryRows(response)
r.logSQL(query, args, err, c)
if err == orm.ErrNoRows { if err == orm.ErrNoRows {
return model.ErrNotFound return model.ErrNotFound
} }
@@ -104,7 +108,15 @@ func (r sqlRepository) queryAll(sq Sqlizer, response interface{}) error {
func (r sqlRepository) exists(existsQuery SelectBuilder) (bool, error) { func (r sqlRepository) exists(existsQuery SelectBuilder) (bool, error) {
existsQuery = existsQuery.Columns("count(*) as count").From(r.tableName) existsQuery = existsQuery.Columns("count(*) as count").From(r.tableName)
var res struct{ Count int64 } var res struct{ Count int64 }
err := r.queryOne(existsQuery, &res) query, args, err := existsQuery.ToSql()
if err != nil {
return false, err
}
err = r.ormer.Raw(query, args...).QueryRow(&res)
if err == orm.ErrNoRows {
err = nil
}
r.logSQL(query, args, err, res.Count)
return res.Count > 0, err return res.Count > 0, err
} }
@@ -148,23 +160,23 @@ func (r sqlRepository) delete(cond Sqlizer) error {
return err return err
} }
func (r sqlRepository) toSql(sq Sqlizer) (string, []interface{}, error) { func (r sqlRepository) logSQL(sql string, args []interface{}, err error, rowsAffected int64) {
sql, args, err := sq.ToSql() var fmtArgs []string
if err == nil { for i := range args {
var fmtArgs []string var f string
for i := range args { switch a := args[i].(type) {
var f string case string:
switch a := args[i].(type) { f = `'` + a + `'`
case string: default:
f = `'` + a + `'` f = fmt.Sprintf("%v", a)
default:
f = fmt.Sprintf("%v", a)
}
fmtArgs = append(fmtArgs, f)
} }
log.Trace(r.ctx, "SQL: `"+sql+"`", "args", `[`+strings.Join(fmtArgs, ",")+`]`) fmtArgs = append(fmtArgs, f)
}
if err != nil {
log.Error(r.ctx, "SQL: `"+sql+"`", "args", `[`+strings.Join(fmtArgs, ",")+`]`, "rowsAffected", rowsAffected, err)
} else {
log.Trace(r.ctx, "SQL: `"+sql+"`", "args", `[`+strings.Join(fmtArgs, ",")+`]`, "rowsAffected", rowsAffected)
} }
return sql, args, err
} }
func (r sqlRepository) parseRestOptions(options ...rest.QueryOptions) model.QueryOptions { func (r sqlRepository) parseRestOptions(options ...rest.QueryOptions) model.QueryOptions {