调整数据获取模式

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
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()
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])
}
switch vvv := value.(type) {
case driver.Valuer:
row[i], _ = vvv.Value()
case sql.RawBytes:
row[i] = string(vvv)
default:
row[i] = vvv
}
}
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
}

View File

@ -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)

View File

@ -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()
}

View File

@ -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)
}