golang连接mysql

1,485 阅读4分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

连接mysql

该示例为纯sql编写进行连接mysql相当于java中得JDBC。golang中也有持久层框架进行数据库操作类似我们java中得hibernate。golang中持久层框架是gorm。关于gorm我们在下面进行说明。

MySQL驱动

Go中支持MySQL的驱动目前比较多,有如下几种,有些是支持database/sql标准,而有些是采用了自己的实现接口,常用的有如下几种:

github.com/Go-SQL-Driv… 支持database/sql,全部采用go写。

github.com/ziutek/mymy… 支持database/sql,也支持自定义的接口,全部采用go写。

github.com/Philio/GoMy… 不支持database/sql,自定义接口,全部采用go写。

接下来我们主要以第一个驱动为例,也推荐大家采用它,主要理由:

  1. 这个驱动比较新,维护的比较好
  2. 完全支持database/sql接口
  3. 支持keepalive,保持长连接,虽然星星fork的mymysql也支持keepalive,但不是线程安全的,这个从底层就

支持了keepalive。

mac下下载mysql的驱动并安装(windows系统需要先安装git):

执行下面两个命令:

下载:go get github.com/Go-SQL-Driver/MySQL
安装:go install github.com/Go-SQL-Driver/MySQL

安装完成以后的文件截图:

image-20210726174648685

接下来我们都将采用同一个数据库表结构:数据库mytest,用户表userinfo,关联用户信息表userdetail。

CREATE TABLE `userinfo` (
`uid` INT(10) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(64) NULL DEFAULT NULL,
`departname` VARCHAR(64) NULL DEFAULT NULL,
`created` DATE NULL DEFAULT NULL,
PRIMARY KEY (`uid`)
)
CREATE TABLE `userdetail` (
`uid` INT(10) NOT NULL DEFAULT '0',
`intro` TEXT NULL,
`profile` TEXT NULL,
PRIMARY KEY (`uid`)
)
连接数据库

要想使用go语言操作mysql,首先需要和mysql数据库建立连接,获取到DB对象。

  1. 首先导入包:
import (
          "database/sql"
          _"github.com/Go-SQL-Driver/MySQL"
)
  1. database/sql,是golang的标准库之一,它提供了一系列接口方法,用于访问关系数据库。它并不会提供数据库特有的方法,那些特有的方法交给数据库驱动去实现。
  2. 我们正在加载的驱动是匿名的,将其限定符别名为_,因此我们的代码中没有一个到处的名称可见。

当导入了一个数据库驱动后, 此驱动会自行初始化并注册自己到Golang的database/sql上下文中, 因此我们就可以通过 database/sql 包提供的方法访问数据库了。

  1. 建立连接

使用Open函数:

Open函数:

func Open(driverName, dataSourceName string) (*DB, error)

其中的两个参数:
    drvierName,这个名字其实就是数据库驱动注册到 database/sql 时所使用的名字.
        "mysql"
    dataSourceName,数据库连接信息,这个连接包含了数据库的用户名, 密码, 数据库主机以及需要连接的数据库名等信息.
        用户名:密码@协议(地址:端口)/数据库?参数=参数值

db, err := sql.Open("mysql", "用户名:密码@tcp(IP:端口)/数据库?charset=utf8")

例如:db, err := sql.Open("mysql", "root:111111@tcp(127.0.0.1:3306)/test?charset=utf8")

说明:

  1. sql.Open并不会立即建立一个数据库的网络连接, 也不会对数据库链接参数的合法性做检验, 它仅仅是初始化一个sql.DB对象. 当真正进行第一次数据库查询操作时, 此时才会真正建立网络连接;
  2. sql.DB表示操作数据库的抽象接口的对象,但不是所谓的数据库连接对象,sql.DB对象只有当需要使用时才会创建连接,如果想立即验证连接,需要用Ping()方法;
  3. sql.Open返回的sql.DB对象是协程并发安全的.
  4. sql.DB的设计就是用来作为长连接使用的。不要频繁Open, Close。比较好的做法是,为每个不同的datastore建一个DB对象,保持这些对象Open。如果需要短连接,那么把DB作为参数传入function,而不要在function中Open, Close。

新建go文件(demo02_mysql_open.go),示例代码:

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    /*
    连接数据库:func Open(driverName, dataSourceName string) (*DB, error)
    Open打开一个dirverName指定的数据库,dataSourceName指定数据源,
    一般包至少括数据库文件名和(可能的)连接信息。

    driverName: 使用的驱动名. 这个名字其实就是数据库驱动注册到 database/sql 时所使用的名字.
    dataSourceName: 数据库连接信息,这个连接包含了数据库的用户名, 密码, 数据库主机以及需要连接的数据库名等信息.

    drvierName,"mysql"
    dataSourceName,用户名:密码@协议(地址:端口)/数据库?参数=参数值

     */

    //"root:123456@tcp(127.0.0.1:3306)/ruby?charset=utf8"
    db, err := sql.Open("mysql", "root:123456@tcp:(127.0.0.1:3306)/mytest?charset=utf8")
    fmt.Println(db)
    fmt.Println(err)
    if err != nil {
        fmt.Println("连接有误。。")
        return
    }
    fmt.Println("连接成功。。")
    db.Close()

}

image-20210726174855122