1.4.8 【实战】从数据库中获取数据并进行合并处理和导出

  1. 从数据库中获取数据并进行合并处理,主要用到database/sql包和encoding/csv包,以及驱动包github.com/go-sql-driver/mysql

  2. 方法:首先连接数据库获取数据,然后进行合并处理,最后导出CSV文件

    import (
    	"database/sql"
    	"encoding/csv"
    	"fmt"
    	_ "github.com/go-sql-driver/mysql"
    	"os"
    )
    
    var (
    	tables = []string{"user", "order"}
    	count  = len(tables)
    	ch     = make(chan bool, count)
    )
    
    // SqlQuery 运行SQL语句
    func SqlQuery(db *sql.DB, table string, ch chan bool) {
    	fmt.Println("开始处理")
    	rows, _ := db.Query(fmt.Sprintf("SELECT * FROM %s", table))
    
    	columns, err := rows.Columns()
    	if err != nil {
    		panic(err.Error())
    	}
    	values := make([]sql.RawBytes, len(columns))
    
    	scanArgs := make([]interface{}, len(values))
    	for i := range values {
    		scanArgs[i] = &values[i]
    	}
    
    	totalValues := [][]string{}
    	for rows.Next() {
    		var s []string
    		// 吧每行内容添加到scanArgs,也添加到了values
    		err = rows.Scan(scanArgs...)
    		if err != nil {
    			panic(err.Error())
    		}
    		for _, v := range values {
    			s = append(s, string(v))
    		}
    		totalValues = append(totalValues, s)
    	}
    	if err = rows.Err(); err != nil {
    		panic(err.Error())
    	}
    	exportToCSV(table+".csv", columns, totalValues)
    	ch <- true
    }
    
    // 导出到CSV
    func exportToCSV(file string, columns []string, totalValues [][]string) {
    	fmt.Println(file)
    	fmt.Println(columns)
    	fmt.Println(totalValues)
    
    	f, err := os.Create(file)
    	if err != nil {
    		panic(err)
    	}
    	f.WriteString("\xEF\xBB\xBF")
    	defer f.Close()
    	w := csv.NewWriter(f)
    	for a, i := range totalValues {
    		if a == 0 {
    			w.Write(columns)
    			w.Write(i)
    		} else {
    			w.Write(i)
    		}
    	}
    	w.Flush()
    	fmt.Println("处理完毕:", file)
    }
    
    func main() {
    
    	// 链接数据库
    	db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/test?charset=utf8")
    
    	defer db.Close()
    
    	if err != nil {
    		panic(err.Error())
    	}
    
    	for _, table := range tables {
    		go SqlQuery(db, table, ch)
    	}
    
    	for i := 0; i < count; i++ {
    		<-ch
    	}
    	fmt.Println("完成")
    
    }

Last updated