调整数据获取模式
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
|
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
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue