zoukankan      html  css  js  c++  java
  • mysql数据导出golang实现

    正文

    mysql数据导出为excel文件,golang实现:

    首先下载依赖到的三方库:

    Simple install the package to your $GOPATH with the go tool from shell:

    $ go get -u github.com/go-sql-driver/mysql
    

    **具体说明请看:** [库地址](https://github.com/go-sql-driver/mysql) [wiki说明](https://github.com/go-sql-driver/mysql/wiki/Examples)

    代码示例如下,用到了go的flag包的能力,传入命令行参数。具体看helpInfo:

    Usage of mysqldataexport:
      -port int
         	the port for mysql,default:32085
      -addr string
        	the address for mysql,default:10.146.145.67
      -user string
        	the username for login mysql,default:dbuser
    
      -pwd 	string
        	the password for login mysql by the username,default:Admin@123
      -db 	string
        	the port for me to listen on,default:auditlogdb
      -tables string
        	the tables will export data, multi tables separator by comma, default:op_log,sc_log,sys_log
    

    代码:

    package main
    
    // 从Mysql中导出数据到CSV文件。
    
    import (
    	"database/sql"
    	"encoding/csv"
    	"fmt"
    	"os"
    	_ "github.com/go-sql-driver/mysql"
    	"flag"
    	"strings"
    )
    
    var (
    	tables         = make([]string, 0)
    	dataSourceName = ""
    )
    
    const (
    	driverNameMysql = "mysql"
    
    	helpInfo = `Usage of mysqldataexport:
      -port int
         	the port for mysql,default:32085
      -addr string
        	the address for mysql,default:10.146.145.67
      -user string
        	the username for login mysql,default:dbuser
    
      -pwd 	string
        	the password for login mysql by the username,default:Admin@123
      -db 	string
        	the port for me to listen on,default:auditlogdb
      -tables string
        	the tables will export data, multi tables separator by comma, default:op_log,sc_log,sys_log
    	`
    )
    
    func init() {
    
    	port := flag.Int("port", 32085, "the port for mysql,default:32085")
    	addr := flag.String("addr", "10.146.145.67", "the address for mysql,default:10.146.145.67")
    	user := flag.String("user", "dbuser", "the username for login mysql,default:dbuser")
    	pwd := flag.String("pwd", "Admin@123", "the password for login mysql by the username,default:Admin@123")
    	db := flag.String("db", "auditlogdb", "the port for me to listen on,default:auditlogdb")
    	tabs := flag.String("tables", "op_log,sc_log,sys_log", "the tables will export data, multi tables separator by comma, default:op_log,sc_log,sys_log")
    
    	flag.Usage = usage
    
    	flag.Parse()
    
    	tables = append(tables, strings.Split(*tabs, ",")...)
    
    	dataSourceName = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8", *user, *pwd, *addr, *port, *db)
    }
    
    func main() {
    
    	count := len(tables)
    	ch := make(chan bool, count)
    
    	db, err := sql.Open(driverNameMysql, dataSourceName)
    	defer db.Close()
    	if err != nil {
    		panic(err.Error())
    	}
    
    	// Open doesn't open a connection. Validate DSN data:
    	err = db.Ping()
    	if err != nil {
    		panic(err.Error())
    	}
    
    	for _, table := range tables {
    		go querySQL(db, table, ch)
    	}
    
    	for i := 0; i < count; i++ {
    		<-ch
    	}
    	fmt.Println("Done!")
    }
    
    func querySQL(db *sql.DB, table string, ch chan bool) {
    	fmt.Println("开始处理:", table)
    	rows, err := db.Query(fmt.Sprintf("SELECT * from %s", table))
    
    	if err != nil {
    		panic(err)
    	}
    
    	columns, err := rows.Columns()
    	if err != nil {
    		panic(err.Error())
    	}
    
    	//values:一行的所有值,把每一行的各个字段放到values中,values长度==列数
    	values := make([]sql.RawBytes, len(columns))
    	// print(len(values))
    
    	scanArgs := make([]interface{}, len(values))
    	for i := range values {
    		scanArgs[i] = &values[i]
    	}
    
    	//存所有行的内容totalValues
    	totalValues := make([][]string, 0)
    	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))
    			// print(len(s))
    		}
    		totalValues = append(totalValues, s)
    	}
    
    	if err = rows.Err(); err != nil {
    		panic(err.Error())
    	}
    	writeToCSV(table+".csv", columns, totalValues)
    	ch <- true
    }
    
    //writeToCSV
    func writeToCSV(file string, columns []string, totalValues [][]string) {
    	f, err := os.Create(file)
    	// fmt.Println(columns)
    	defer f.Close()
    	if err != nil {
    		panic(err)
    	}
    	//f.WriteString("xEFxBBxBF")
    	w := csv.NewWriter(f)
    	for i, row := range totalValues {
    		//第一次写列名+第一行数据
    		if i == 0 {
    			w.Write(columns)
    			w.Write(row)
    		} else {
    			w.Write(row)
    		}
    	}
    	w.Flush()
    	fmt.Println("处理完毕:", file)
    }
    
    func usage() {
    	fmt.Fprint(os.Stderr, helpInfo)
    	flag.PrintDefaults()
    }
    
    

    操作示例:

    编译代码生成可执行文件:

    go build mysqldataexport.go
    

    在这里插入图片描述

    数据库中有test2库下的test表:

    在这里插入图片描述

    导出其中的数据:

    .mysqldataexport.exe -port=3306 -addr="localhost" -user="root" -pwd="mysql" -db="test2" -tables="test"
    

    在这里插入图片描述

    导出结果如下:

    在这里插入图片描述



    本公众号免费提供csdn下载服务,海量IT学习资源,如果你准备入IT坑,励志成为优秀的程序猿,那么这些资源很适合你,包括但不限于java、go、python、springcloud、elk、嵌入式 、大数据、面试资料、前端 等资源。同时我们组建了一个技术交流群,里面有很多大佬,会不定时分享技术文章,如果你想来一起学习提高,可以公众号后台回复【2】,免费邀请加技术交流群互相学习提高,会不定期分享编程IT相关资源。


    扫码关注,精彩内容第一时间推给你

    image

  • 相关阅读:
    Android——继续深造——从安装Android Studio 2.0开始(详)
    PHP——安装wampserver丢失MSVCR110.dll
    Marza Gift for GDC 2016
    Retrieve OpenGL Context from Qt 5.5 on OSX
    Space Time Varying Color Palette
    Screen Space Depth Varying Glow based on Heat Diffusion
    Visualization of Detail Point Set by Local Algebraic Sphere Fitting
    Glass Dragon
    Jump Flood Algorithms for Centroidal Voronoi Tessellation
    京都之行
  • 原文地址:https://www.cnblogs.com/liabio/p/11723313.html
Copyright © 2011-2022 走看看