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

  • 相关阅读:
    Fiddler 的几个用法
    jQuery中ajax的使用和缓存问题解决 $getjson 与$get都会被IE缓存
    http与https的区别以及https的加密原理
    asp.net mvc通过预处理实现数据过滤和数据篡改。
    C# winform的WebBrowser非常规编程(强烈推荐)
    DES加密 java与.net可以相互加密解密的方法
    日常开发中常见的HTTP协议的状态码
    前端性能监控
    在手机的浏览器上通过连接打开App
    工作五年总结一二三流公司的常见特性
  • 原文地址:https://www.cnblogs.com/liabio/p/11723313.html
Copyright © 2011-2022 走看看