本节核心内容
- 介绍链接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.Open
初始化一个DB对象 - 对
DB
对象进行属性设置 - 调用
DB.Ping()
方法测试链接是否通畅
注意事项
Open()函数
在上面的代码中,我们通过调用sql.Open函数返回一个sql.DB指针; sql.Open函数原型如下:
func Open(driverName, dataSourceName string) (*DB, error)
参数为:
- driverName: 使用的驱动名. 这个名字其实就是数据库驱动注册到 database/sql 时所使用的名字.
- dataSourceName: 数据库连接信息,这个连接包含了数据库的用户名, 密码, 数据库主机以及需要连接的数据库名等信息.
注意事项
- sql.Open并不会立即建立一个数据库的网络连接, 也不会对数据库链接参数的合法性做检验, 它仅仅是初始化一个sql.DB对象. 当真正进行第一次数据库查询操作时, 此时才会真正建立网络连接;
- sql.DB表示操作数据库的抽象接口的对象,但不是所谓的数据库连接对象,sql.DB对象只有当需要使用时才会创建连接,如果想立即验证连接,需要用Ping()方法;
- sql.Open返回的sql.DB对象是协程并发安全的.
- 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的初始化链接,以及讲解了在初见数据库链接时的一些注意事项。
请发表评论