go语言连接mysql

一、安装

在windows下安装

1、goland(go IDE) 安装位置:
 D:\package\goland
2、go 安装位置 :
 D:\package\go
3、GOPATH 位置:
 D:\package\go\workspaceD:\package\go\workspace
 创建三个空文件夹 在GOPATH目录下创建三个文件 bin 、src 、pkg
4、GOROOT 位置:
 D:\package\go
5、配置正确的环境变量 在path中配置 GOPATH 和 GOROOT

在linux下安装

1、解压安装包
>tar -zxvf go1.7.6.linux-amd64.tar.gz
2、安装目录为:
/opt/go/go
3、工作目录为:
/opt/go/workspace
4、配置环境变量
>vi ~/.bashrc
export GOROOT=/opt/go/go
export PATH=$GOROOT/bin:$PATH
export GOPATH=/opt/go/workspace
5、刷新环境变量
source ~/.bashrc
6、执行测试程序test.go
> go run test.go

二、安装GIT

安装git,为了用来下载mysql驱动包,此操作在Windows下执行

1、git安装目录为:
D:\package\Git
2、给path中配置git的环境变量
3、使用git下载mysql的驱动
在Windows中 ,使用cmd切换到GOPATH的src目录下 ,执行
>go get github.com/go-sql-driver/MYSQL
1)异常信息:
    fatal: unable to access 'https://github.com/go-sql-driver/MYSQL/': error setting certificate verify locations:
      CAfile: D:/package/Git/mingw64/libexec/ssl/certs/ca-bundle.crt
      CApath: none
    package github.com/go-sql-driver/MYSQL: exit status 128

2)解决办法:
    在git安装目录下打开git-bash,执行以下命令即可;
    >  git config --system http.sslverify false
4、导入驱动包
下载好驱动后可看到在GOPATH目录下的src文件下生成github.com这个文件
在go程序中导入以下包
    import(
        "database/sql"
        _"github.com/Go-SQL-Driver/MySQL"//就是你下载的文件地址,如果是自己拷贝的,那么就写自己创建的路径
        "log"
        //"reflect"    //获取变量类型用
    )

三、编译程序

在Windows中编译Windows可执行文件

1、在windows中,使用cmd切换到工程目录中
2、使用 go run project_name 即可执行程序;
3、使用 go build projec_name 即可编译程序;
4、编译好的程序执行执行即可。

在Windows中编译linux可执行文件

1、首先需要设置以下两个参数:
set GOARCH=amd64
set GOOS=linux
2、编译程序,使用go build 出来的就是linux 64 位的可执行程序了
3、例如test.go 这个go程序
    执行 go build test.go
    生成编译好的test文件
    在linux机器中执行 ./test 即可。

四、连接脚本

package main
import(
   "database/sql"
   _"github.com/Go-SQL-Driver/MySQL"//就是你下载的文件地址,如果是自己拷贝的,那么就写自己创建的路径
   "log"
   "fmt"
   "time"
)

func main() {
   //username mysql账号
   var userName = "test2"
   //password mysql密码
   var passWord = "abc"
   //ip   mysql数据库的IP
   var ip = "192.168.136.136"
   //port  mysql数据库的端口
   var port = "3306"
   // database 需要连接的数据库名称
   var database = "test"

   dataSourceName := sourceName2(userName,passWord ,ip ,port ,database)
   //连接示例
   // db,err := sql.Open("mysql","test2:abc@tcp(192.168.136.136:3306)/test?charset=utf8" )
   conn,err := sql.Open("mysql",dataSourceName )
   if err != nil{
      panic(err.Error())
      log.Println(err)
      return
   }else {
      fmt.Println("connection mysql succcess ! ")
   }
   defer conn.Close()  //只有在前面用了 panic[抛出异常] 这时defer才能起作用,如果链接数据的时候出问题,他会往err写数据。defer:延迟,这里立刻申请了一个关闭sql 链接的草错,defer 后的方法,或延迟执行。在函数抛出异常一会被执行


   //产生查询语句的Statement
   stmt, err := conn.Prepare(`show tables`)
   if err != nil {
      log.Fatal("Prepare failed:", err.Error())
   }
   defer stmt.Close()

   //通过Statement执行查询
   rows, err := stmt.Query()
   if err != nil {
      log.Fatal("Query failed:", err.Error())
   }

   //建立一个列数组
   cols, err := rows.Columns()
   var colsdata = make([]interface{}, len(cols))
   for i := 0; i < len(cols); i++ {
      colsdata[i] = new(interface{})
      fmt.Print(cols[i])
      fmt.Print("\t")
   }
   fmt.Println()

   //遍历每一行
   for rows.Next() {
      rows.Scan(colsdata...) //将查到的数据写入到这行中
      PrintRow(colsdata)     //打印此行
   }
   defer rows.Close()
}
//连接到mysql
func sourceName2(userName , passWord ,ip , port, database string) string{
   var connection string
   connection =  userName + ":" + passWord +"@tcp(" + ip + ":" + port + ")/"+database+"?charset=utf8"
   return  connection
}
//打印一行记录,传入一个行的所有列信息
func PrintRow(colsdata []interface{}) {
   for _, val := range colsdata {
      switch v := (*(val.(*interface{}))).(type) {
      case nil:
         fmt.Print("NULL")
      case bool:
         if v {
            fmt.Print("True")
         } else {
            fmt.Print("False")
         }
      case []byte:
         fmt.Print(string(v))
      case time.Time:
         fmt.Print(v.Format)
      default:
         fmt.Print(v)
      }
      fmt.Print("\t")
   }
   fmt.Println()
}

    原文作者:Havi
    原文地址: https://zhuanlan.zhihu.com/p/36689881
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞