60 lines
1011 B
Go
60 lines
1011 B
Go
package db
|
|
|
|
import (
|
|
"context"
|
|
"excel_export/biz/export"
|
|
"gorm.io/driver/mysql"
|
|
"gorm.io/gorm"
|
|
"runtime/trace"
|
|
)
|
|
|
|
var _ export.DataFetcher = new(Db)
|
|
|
|
type Db struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewDb(str string) (*Db, error) {
|
|
db, err := gorm.Open(mysql.Open(str + ""))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
//db = db.Debug()
|
|
return &Db{
|
|
db: db,
|
|
}, nil
|
|
}
|
|
|
|
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, err := rows.Columns()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
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[i] = interface{}(row)
|
|
}
|
|
|
|
return &export.Data{
|
|
Title: titles,
|
|
Data: data,
|
|
}, nil
|
|
}
|