diff --git a/g/database/gdb/gdb.go b/g/database/gdb/gdb.go index 0be4d383e..a718f8c6b 100644 --- a/g/database/gdb/gdb.go +++ b/g/database/gdb/gdb.go @@ -97,6 +97,7 @@ type Sql struct { Sql string // SQL语句(可能带有预处理占位符) Args []interface{} // 预处理参数值列表 Error error // 执行结果(nil为成功) + Cost int64 // 执行时间消耗(毫秒) Func string // 执行方法名称 } diff --git a/g/database/gdb/gdb_base.go b/g/database/gdb/gdb_base.go index 137d617fe..d787e9693 100644 --- a/g/database/gdb/gdb_base.go +++ b/g/database/gdb/gdb_base.go @@ -16,6 +16,7 @@ import ( "gitee.com/johng/gf/g/util/gstr" "gitee.com/johng/gf/g/util/gconv" "gitee.com/johng/gf/g/container/gring" + "gitee.com/johng/gf/g/os/gtime" ) const ( @@ -68,15 +69,22 @@ func (db *Db) Close() error { // 数据库sql查询操作,主要执行查询 func (db *Db) Query(query string, args ...interface{}) (*sql.Rows, error) { - p := db.link.handleSqlBeforeExec(&query) - rows, err := db.slave.Query(*p, args ...) + var err error + var rows *sql.Rows + p := db.link.handleSqlBeforeExec(&query) if db.debug.Val() { + militime1 := gtime.Millisecond() + rows, err = db.slave.Query(*p, args ...) + militime2 := gtime.Millisecond() db.sqls.Put(&Sql{ Sql : *p, Args : args, Error : err, + Cost : militime2 - militime1, Func : "DB:Query", }) + } else { + rows, err = db.slave.Query(*p, args ...) } if err == nil { return rows, nil @@ -88,17 +96,24 @@ func (db *Db) Query(query string, args ...interface{}) (*sql.Rows, error) { // 执行一条sql,并返回执行情况,主要用于非查询操作 func (db *Db) Exec(query string, args ...interface{}) (sql.Result, error) { - p := db.link.handleSqlBeforeExec(&query) - r, err := db.master.Exec(*p, args ...) + var err error + var result sql.Result + p := db.link.handleSqlBeforeExec(&query) if db.debug.Val() { + militime1 := gtime.Millisecond() + result, err = db.master.Exec(*p, args ...) + militime2 := gtime.Millisecond() db.sqls.Put(&Sql{ Sql : *p, Args : args, Error : err, + Cost : militime2 - militime1, Func : "DB:Exec", }) + } else { + result, err = db.master.Exec(*p, args ...) } - return r, db.formatError(err, p, args...) + return result, db.formatError(err, p, args...) } // 格式化错误信息 diff --git a/g/database/gdb/gdb_transaction.go b/g/database/gdb/gdb_transaction.go index 8ad0f3696..09d0cc94f 100644 --- a/g/database/gdb/gdb_transaction.go +++ b/g/database/gdb/gdb_transaction.go @@ -15,6 +15,7 @@ import ( _ "github.com/go-sql-driver/mysql" "gitee.com/johng/gf/g/util/gconv" "reflect" + "gitee.com/johng/gf/g/os/gtime" ) // 数据库事务对象 @@ -35,15 +36,22 @@ func (tx *Tx) Rollback() error { // (事务)数据库sql查询操作,主要执行查询 func (tx *Tx) Query(query string, args ...interface{}) (*sql.Rows, error) { - p := tx.db.link.handleSqlBeforeExec(&query) - rows, err := tx.tx.Query(*p, args ...) + var err error + var rows *sql.Rows + p := tx.db.link.handleSqlBeforeExec(&query) if tx.db.debug.Val() { + militime1 := gtime.Millisecond() + rows, err = tx.tx.Query(*p, args ...) + militime2 := gtime.Millisecond() tx.db.sqls.Put(&Sql{ Sql : *p, Args : args, Error : err, + Cost : militime2 - militime1, Func : "TX:Query", }) + } else { + rows, err = tx.tx.Query(*p, args ...) } if err == nil { return rows, nil @@ -55,17 +63,24 @@ func (tx *Tx) Query(query string, args ...interface{}) (*sql.Rows, error) { // (事务)执行一条sql,并返回执行情况,主要用于非查询操作 func (tx *Tx) Exec(query string, args ...interface{}) (sql.Result, error) { - p := tx.db.link.handleSqlBeforeExec(&query) - r, err := tx.tx.Exec(*p, args ...) + var err error + var result sql.Result + p := tx.db.link.handleSqlBeforeExec(&query) if tx.db.debug.Val() { + militime1 := gtime.Millisecond() + result, err = tx.tx.Exec(*p, args ...) + militime2 := gtime.Millisecond() tx.db.sqls.Put(&Sql{ Sql : *p, Args : args, Error : err, + Cost : militime2 - militime1, Func : "TX:Exec", }) + } else { + result, err = tx.tx.Exec(*p, args ...) } - return r, tx.db.formatError(err, p, args...) + return result, tx.db.formatError(err, p, args...) } // 数据库查询,获取查询结果集,以列表结构返回 diff --git a/geg/database/mysql/gdb_debug.go b/geg/database/mysql/gdb_debug.go new file mode 100644 index 000000000..ba73a5fd4 --- /dev/null +++ b/geg/database/mysql/gdb_debug.go @@ -0,0 +1,43 @@ +package main + +import ( + "fmt" + "gitee.com/johng/gf/g/database/gdb" +) + +var db *gdb.Db + +// 初始化配置及创建数据库 +func init () { + gdb.AddDefaultConfigNode(gdb.ConfigNode { + Host : "127.0.0.1", + Port : "3306", + User : "root", + Pass : "123456", + Name : "test", + Type : "mysql", + Role : "master", + Charset : "utf8", + }) + db, _ = gdb.New() +} + + +func main() { + db.SetDebug(true) + // 执行3条SQL查询 + for i := 1; i <= 3; i++ { + db.Table("user").Where("uid=?", i).One() + } + // 构造一条错误查询 + db.Table("user").Where("no_such_field=?", "just_test").One() + + for k, v := range db.GetQueriedSqls() { + fmt.Println(k, ":") + fmt.Println("Sql :", v.Sql) + fmt.Println("Args :", v.Args) + fmt.Println("Error:", v.Error) + fmt.Println("Cost :", v.Cost) + fmt.Println("Func :", v.Func) + } +} \ No newline at end of file