refactor: better SQL logging
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user