From b62b78edfecf47aed818d96ad4a1589208cc640b Mon Sep 17 00:00:00 2001 From: Deluan Date: Sat, 1 Feb 2020 15:06:49 -0500 Subject: [PATCH] refactor: better SQL logging --- persistence/sql_base_repository.go | 52 ++++++++++++++++++------------ 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/persistence/sql_base_repository.go b/persistence/sql_base_repository.go index 7f3bb4590..16d8c5914 100644 --- a/persistence/sql_base_repository.go +++ b/persistence/sql_base_repository.go @@ -64,11 +64,13 @@ func (r sqlRepository) applyFilters(sq SelectBuilder, options ...model.QueryOpti } func (r sqlRepository) executeSQL(sq Sqlizer) (int64, error) { - query, args, err := r.toSql(sq) + query, args, err := sq.ToSql() if err != nil { return 0, err } res, err := r.ormer.Raw(query, args...).Exec() + c, _ := res.RowsAffected() + r.logSQL(query, args, err, c) if err != nil { if err.Error() != "LastInsertId is not supported by this driver" { return 0, err @@ -78,11 +80,12 @@ func (r sqlRepository) executeSQL(sq Sqlizer) (int64, error) { } func (r sqlRepository) queryOne(sq Sqlizer, response interface{}) error { - query, args, err := r.toSql(sq) + query, args, err := sq.ToSql() if err != nil { return err } err = r.ormer.Raw(query, args...).QueryRow(response) + r.logSQL(query, args, err, 1) if err == orm.ErrNoRows { 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 { - query, args, err := r.toSql(sq) + query, args, err := sq.ToSql() if err != nil { 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 { return model.ErrNotFound } @@ -104,7 +108,15 @@ func (r sqlRepository) queryAll(sq Sqlizer, response interface{}) error { func (r sqlRepository) exists(existsQuery SelectBuilder) (bool, error) { existsQuery = existsQuery.Columns("count(*) as count").From(r.tableName) 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 } @@ -148,23 +160,23 @@ func (r sqlRepository) delete(cond Sqlizer) error { return err } -func (r sqlRepository) toSql(sq Sqlizer) (string, []interface{}, error) { - sql, args, err := sq.ToSql() - if err == nil { - var fmtArgs []string - for i := range args { - var f string - switch a := args[i].(type) { - case string: - f = `'` + a + `'` - default: - f = fmt.Sprintf("%v", a) - } - fmtArgs = append(fmtArgs, f) +func (r sqlRepository) logSQL(sql string, args []interface{}, err error, rowsAffected int64) { + var fmtArgs []string + for i := range args { + var f string + switch a := args[i].(type) { + case string: + f = `'` + a + `'` + default: + f = fmt.Sprintf("%v", a) } - 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 {