本节核心内容
  • 介绍链接MySQL有哪些必备条件
  • 介绍Mysql配置文件的配置规则
  • 介绍如何连接数据库
  • 讲解在初始化时的注意事项和常见问题

本小节视频教程和代码:百度网盘

可先下载视频和源码到本地,边看视频边结合源码理解后续内容,边学边练。

简介

Golang 提供了database/sql包用于对SQL数据库的访问, 作为操作数据库的入口对象sql.DB, 主要为我们提供了两个重要的功能:

  • sql.DB 通过数据库驱动为我们提供管理底层数据库连接的打开和关闭操作.
  • sql.DB 为我们管理数据库连接池

需要注意的是,sql.DB表示操作数据库的抽象访问接口,而非一个数据库连接对象;它可以根据driver打开关闭数据库连接,管理连接池。正在使用的连接被标记为繁忙,用完后回到连接池等待下次使用。所以,如果你没有把连接释放回连接池,会导致过多连接使系统资源耗尽。

导入MySQL数据库驱动
import (
   "database/sql"
   _ "github.com/go-sql-driver/mysql"
)

通常来说, 不应该直接使用驱动所提供的方法, 而是应该使用 sql.DB, 因此在导入 mysql 驱动时, 这里使用了匿名导入的方式(在包路径前添加 _), 当导入了一个数据库驱动后, 此驱动会自行初始化并注册自己到Golang的database/sql上下文中, 因此我们就可以通过 database/sql 包提供的方法访问数据库了.

MySQL配置文件规则

在使用MySQL之前,我们需要先来进行一些配置

mysql:
  #最大空闲连接数
  max_idle_conns: 50
  #链接
  source_name: root:root@tcp(127.0.0.1:3306)/test?parseTime=true&charset=utf8&loc=Local

它的配置规则如下:

 账号:密码@tcp(IP:端口号)/数据库名?parseTime=true&charset=utf8&loc=Local

在有了正确的配置文件后,我们就可以通过读取配置文件来进行MySQL的初识化工作,从而使程序能链接访问MySQL数据库。

连接数据库
package model

import (
	"database/sql"
	"log"

	"mysql/config"

	_ "github.com/go-sql-driver/mysql" //这个引用是必不可少的,因为需要调用driver.go文件里的init方法来提供一个数据库驱动程序
	"github.com/spf13/viper"
)

var DB *sql.DB     //全局变量,这样可以在别处调用

func Init() *sql.DB {

	var err error
	//加载配置文件
	config.Init()

	//这行代码的作用就是初始化一个sql.DB对象
	DB ,err = sql.Open("mysql", viper.GetString("mysql.source_name"))
	if nil != err {
		panic(err)
	}

	//设置最大超时时间
	DB.SetMaxIdleConns(viper.GetInt("mysql.max_idle_conns"))

	//建立链接
	err = DB.Ping()
	if nil != err{
		panic(err)
	}else{
		log.Println("Mysql Startup Normal!")
	}
	return DB
}

在看完上边的代码之后,是不是感觉很简单,总结上面代码我们可以发现,我们想建立一个MySQL链接只需要以下这四步:

_ "github.com/go-sql-driver/mysql"sql.OpenDBDB.Ping()
注意事项

Open()函数

在上面的代码中,我们通过调用sql.Open函数返回一个sql.DB指针; sql.Open函数原型如下:

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

参数为:

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

注意事项

  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。

Mysql日期时间类型报错

sql: Scan error on column index 1: unsupported Scan, storing driver.Value type []uint8 into type *time.Time

原因是在调用sql.Open()时没有将parseTime设置为True。加入parseTime即可修复问题:

db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname?parseTime=true")

小节

本小节主要演示了在Go语言中,如何去编写MySQL配置文件和对MySQL的初始化链接,以及讲解了在初见数据库链接时的一些注意事项。