本節核心內容
- 介紹鏈接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的初始化鏈接,以及講解了在初見數據庫鏈接時的一些注意事項。