Go語言從入門到精通 -【web項目實戰篇】- MySQL的初始化

本節核心內容

  • 介紹鏈接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: 數據庫連接信息,這個連接包含了數據庫的用戶名, 密碼, 數據庫主機以及需要連接的數據庫名等信息.

注意事項

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章