调整数据获取模式
This commit is contained in:
parent
987e24bf29
commit
311b48815a
72
biz/db/db.go
72
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()
|
||||
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
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue