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 }