mysql数据导出golang实现

mb5fcdf2add9b6a · · 303 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

mysql数据导出golang实现

mysql数据导出golang实现

阅读本文大约需要5分钟。

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:

flag包的使用可以参考:golang flag包使用笔记

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

mysql数据导出golang实现

代码:

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("\xEF\xBB\xBF")
   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

mysql数据导出golang实现

数据库中有test2库下的test表:
mysql数据导出golang实现

导出其中的数据:

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

mysql数据导出golang实现

导出结果如下:
mysql数据导出golang实现

go语言、docker、k8s、数据库等学习资源可以公众号回复【1】加小助手索取。

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


有疑问加站长微信联系(非本文作者)

本文来自:51CTO博客

感谢作者:mb5fcdf2add9b6a

查看原文:mysql数据导出golang实现

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

303 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传