调整数据获取模式

This commit is contained in:
Mr.Li 2023-04-08 17:47:09 +08:00
parent 987e24bf29
commit 311b48815a
4 changed files with 39 additions and 60 deletions

View File

@ -1,13 +1,11 @@
package db package db
import ( import (
"database/sql" "context"
"database/sql/driver"
"excel_export/biz/export" "excel_export/biz/export"
"fmt"
"gorm.io/driver/mysql" "gorm.io/driver/mysql"
"gorm.io/gorm" "gorm.io/gorm"
"reflect" "runtime/trace"
) )
var _ export.DataFetcher = new(Db) var _ export.DataFetcher = new(Db)
@ -28,42 +26,30 @@ func NewDb(str string) (*Db, error) {
} }
func (d *Db) Fetch(s string) (*export.Data, 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() rows, err := d.db.Raw(s).Rows()
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer rows.Close() defer rows.Close()
titles, values, err := getRowStruct(rows)
titles, err := rows.Columns()
if err != nil { if err != nil {
return nil, err return nil, err
} }
var data []interface{} var dd []map[string]interface{}
d.db.ScanRows(rows, &dd)
for rows.Next() { data := make([]interface{}, len(dd))
rows.Scan(values...) for i, m := range dd {
row := make([]interface{}, len(values)) row := make([]interface{}, 0, len(m))
for i, value := range values { for _, title := range titles {
row = append(row, m[title])
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
}
} }
data[i] = interface{}(row)
data = append(data, row)
// 业务逻辑...
} }
return &export.Data{ return &export.Data{
@ -71,29 +57,3 @@ func (d *Db) Fetch(s string) (*export.Data, error) {
Data: data, Data: data,
}, nil }, 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
}

View File

@ -1,6 +1,7 @@
package db package db
import ( import (
"excel_export/biz/util"
"fmt" "fmt"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"testing" "testing"
@ -9,10 +10,13 @@ import (
const test_db = "root:root@(192.168.6.74:3307)/recharge_trade?charset=utf8mb4&parseTime=true" const test_db = "root:root@(192.168.6.74:3307)/recharge_trade?charset=utf8mb4&parseTime=true"
func TestDb_Fetch(t *testing.T) { func TestDb_Fetch(t *testing.T) {
p := util.NewProf()
defer p.Close()
db, err := NewDb(test_db) db, err := NewDb(test_db)
assert.Nil(t, err) 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) ret, err := db.Fetch(sql)
assert.Nil(t, err) assert.Nil(t, err)
fmt.Printf("%v \n", ret) fmt.Printf("%v \n", ret)

View File

@ -4,11 +4,13 @@ import (
"log" "log"
"os" "os"
"runtime/pprof" "runtime/pprof"
"runtime/trace"
) )
type Pprof struct { type Pprof struct {
fc *os.File fc *os.File
fm *os.File fm *os.File
ft *os.File
} }
func NewProf() *Pprof { func NewProf() *Pprof {
@ -22,23 +24,31 @@ func NewProf() *Pprof {
log.Fatal(err) log.Fatal(err)
} }
ft, err := os.Create("./trace.out")
if err != nil {
log.Fatal(err)
}
p := &Pprof{ p := &Pprof{
fc: fc, fc: fc,
fm: fm, fm: fm,
ft: ft,
} }
p.Start() p.Start()
return p return p
} }
func (p *Pprof) Start() { func (p *Pprof) Start() {
trace.Start(p.ft)
pprof.StartCPUProfile(p.fc) pprof.StartCPUProfile(p.fc)
pprof.WriteHeapProfile(p.fm)
} }
func (p *Pprof) Close() { func (p *Pprof) Close() {
pprof.WriteHeapProfile(p.fm)
pprof.StopCPUProfile() pprof.StopCPUProfile()
trace.Stop()
p.fc.Close() p.fc.Close()
p.fm.Close() p.fm.Close()
p.ft.Close()
} }

View File

@ -2,6 +2,7 @@ package main
import ( import (
"excel_export/biz/config" "excel_export/biz/config"
"excel_export/biz/util"
"excel_export/cmd/cmd" "excel_export/cmd/cmd"
"github.com/tealeg/xlsx/v3" "github.com/tealeg/xlsx/v3"
"os" "os"
@ -11,6 +12,11 @@ import (
var Config *config.Config var Config *config.Config
func main() { func main() {
p := util.NewProf()
defer func() {
p.Close()
}()
//设置默认格式 //设置默认格式
xlsx.DefaultDateTimeOptions = xlsx.DateTimeOptions{ xlsx.DefaultDateTimeOptions = xlsx.DateTimeOptions{
Location: time.UTC, Location: time.UTC,
@ -21,5 +27,4 @@ func main() {
Config = config.LoadConfig(path + "/config") Config = config.LoadConfig(path + "/config")
cmd.Execute() cmd.Execute()
os.Exit(0)
} }