diff --git a/biz/db/db.go b/biz/db/db.go index 854e679..fcaa2f5 100644 --- a/biz/db/db.go +++ b/biz/db/db.go @@ -1,13 +1,11 @@ package db import ( - "database/sql" - "database/sql/driver" + "context" "excel_export/biz/export" - "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" - "reflect" + "runtime/trace" ) var _ export.DataFetcher = new(Db) @@ -28,42 +26,30 @@ func NewDb(str string) (*Db, error) { } func (d *Db) Fetch(s string) (*export.Data, error) { - + fetchRegion := trace.StartRegion(context.Background(), "db.fetch") + defer func() { + fetchRegion.End() + }() rows, err := d.db.Raw(s).Rows() if err != nil { return nil, err } defer rows.Close() - titles, values, err := getRowStruct(rows) + + titles, err := rows.Columns() if err != nil { return nil, err } - var data []interface{} - - for rows.Next() { - rows.Scan(values...) - row := make([]interface{}, len(values)) - for i, value := range values { - - vv := reflect.ValueOf(value) - if vv.Kind() == reflect.Ptr { - //将指针对象转换为值对象 - value = vv.Elem().Interface() - } - - switch vvv := value.(type) { - case driver.Valuer: - row[i], _ = vvv.Value() - case sql.RawBytes: - row[i] = string(vvv) - default: - row[i] = vvv - } + var dd []map[string]interface{} + d.db.ScanRows(rows, &dd) + data := make([]interface{}, len(dd)) + for i, m := range dd { + row := make([]interface{}, 0, len(m)) + for _, title := range titles { + row = append(row, m[title]) } - - data = append(data, row) - // 业务逻辑... + data[i] = interface{}(row) } return &export.Data{ @@ -71,29 +57,3 @@ func (d *Db) Fetch(s string) (*export.Data, error) { Data: data, }, nil } - -func getRowStruct(rows *sql.Rows) (title []string, t []interface{}, err error) { - titles, _ := rows.Columns() - - tt, err := rows.ColumnTypes() - if err != nil { - return nil, nil, fmt.Errorf("ColumnTypes: %v", err) - } - - types := make([]reflect.Type, len(tt)) - for i, tp := range tt { - st := tp.ScanType() - if st == nil { - return nil, nil, fmt.Errorf("scantype is null for column %q", tp.Name()) - } - types[i] = st - } - - values := make([]interface{}, len(tt)) - for i := range values { - values[i] = reflect.New(types[i]).Interface() - } - - return titles, values, nil - -} diff --git a/biz/db/db_test.go b/biz/db/db_test.go index c834a28..b029ff6 100644 --- a/biz/db/db_test.go +++ b/biz/db/db_test.go @@ -1,6 +1,7 @@ package db import ( + "excel_export/biz/util" "fmt" "github.com/stretchr/testify/assert" "testing" @@ -9,10 +10,13 @@ import ( const test_db = "root:root@(192.168.6.74:3307)/recharge_trade?charset=utf8mb4&parseTime=true" func TestDb_Fetch(t *testing.T) { + p := util.NewProf() + defer p.Close() + db, err := NewDb(test_db) assert.Nil(t, err) - sql := "select trade_number as `交易号`,account as `充值号码` from trade limit 10" + sql := "select * from trade limit 10" ret, err := db.Fetch(sql) assert.Nil(t, err) fmt.Printf("%v \n", ret) diff --git a/biz/util/ppro.go b/biz/util/ppro.go index 0b1e578..182ea97 100644 --- a/biz/util/ppro.go +++ b/biz/util/ppro.go @@ -4,11 +4,13 @@ import ( "log" "os" "runtime/pprof" + "runtime/trace" ) type Pprof struct { fc *os.File fm *os.File + ft *os.File } func NewProf() *Pprof { @@ -22,23 +24,31 @@ func NewProf() *Pprof { log.Fatal(err) } + ft, err := os.Create("./trace.out") + if err != nil { + log.Fatal(err) + } + p := &Pprof{ fc: fc, fm: fm, + ft: ft, } p.Start() return p } func (p *Pprof) Start() { + trace.Start(p.ft) pprof.StartCPUProfile(p.fc) - pprof.WriteHeapProfile(p.fm) } func (p *Pprof) Close() { + pprof.WriteHeapProfile(p.fm) pprof.StopCPUProfile() - + trace.Stop() p.fc.Close() p.fm.Close() + p.ft.Close() } diff --git a/cmd/main.go b/cmd/main.go index f597d30..15dbeb1 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -2,6 +2,7 @@ package main import ( "excel_export/biz/config" + "excel_export/biz/util" "excel_export/cmd/cmd" "github.com/tealeg/xlsx/v3" "os" @@ -11,6 +12,11 @@ import ( var Config *config.Config func main() { + p := util.NewProf() + defer func() { + p.Close() + }() + //设置默认格式 xlsx.DefaultDateTimeOptions = xlsx.DateTimeOptions{ Location: time.UTC, @@ -21,5 +27,4 @@ func main() { Config = config.LoadConfig(path + "/config") cmd.Execute() - os.Exit(0) }