1. 程式人生 > >golang 連線mysql資料庫

golang 連線mysql資料庫

Go專案,也就是golang程式碼中,需要實現往資料庫插入資料等操作,則需要以下程式碼:

1.  隨便找個資料夾下(我的為 db 資料夾),建立檔案dbConn.go

package db

import (
        "database/sql"

        _ "xxx/mysql"   //(這裡的mysql資料夾,是從 github.com/go-sql-driver/mysql 下載到我的專案的)  

         "xxx/g"

        "log"
        "sync"
)


var (
        dbLock    sync.RWMutex
        dbConnMap map[string]*sql.DB
)

var DB *sql.DB

//初始化資料庫連線,這裡個initDB()方法,會放到專案的main.go檔案中呼叫

func InitDB() {
        var err error
        DB, err = makeDbConn()
        if DB == nil || err != nil {
                log.Fatalln("g.InitDB, get db conn fail", err)
        }

        dbConnMap = make(map[string]*sql.DB)
        log.Println("g.InitDB ok")
}

//需要和資料庫 互動的時候,呼叫這個GetDbConn方法,獲取一個數據庫連結

func GetDbConn(connName string) (c *sql.DB, e error) {
        dbLock.Lock()
        defer dbLock.Unlock()

        var err error

  var dbConn *sql.DB
        dbConn = dbConnMap[connName]
        if dbConn == nil {
                dbConn, err = makeDbConn()
                if dbConn == nil || err != nil {
                        closeDbConn(dbConn)
                        return nil, err
                }
                dbConnMap[connName] = dbConn
        }

        err = dbConn.Ping()
        if err != nil {
                closeDbConn(dbConn)
                delete(dbConnMap, connName)
                return nil, err
        }

        return dbConn, err
}

//執行資料庫連線的具體程式碼
func makeDbConn() (conn *sql.DB, err error) {
        conn, err = sql.Open("mysql", g.Config().xxx.Database

) //這裡的g.Config().xxx.Database,根據你自己的實際配置情況填寫,比如我的這裡是cfg.json檔案裡的xxx欄位的Database是實際資料庫的連線資訊:root:@tcp(127.0.0.1:3306)/graph?loc=Local&parseTime=true
        if err != nil {
                return nil, err
        }

        conn.SetMaxIdleConns(g.Config().DbInfo.MaxIdle)
        err = conn.Ping()

        return conn, err

}

func closeDbConn(conn *sql.DB) {
        if conn != nil {
                conn.Close()
        }

}

2. 專案的main.go檔案main()方法中,新增資料庫初始呼叫

package main

import (
        "xxx/db"   //(這裡的xxx是第一個步驟裡程式碼的路徑)
)

func main() {

           //初始化資料庫

          db.InitDB()

}

3. 程式碼中 需要增刪改查資料庫時,比如我的cron包中的reporter.go檔案 中,需要呼叫 資料庫

package cron

//此方法需要更新資料庫的資料

func reportAgentStatus(interval time.Duration) {

                                         dbConn, err := db.GetDbConn("hostTable") //此處的hostTable隨便填寫,就是你給自己的此次資料庫連線,取個名字而已
                                          if err != nil {
                                                 log.Println("[ERROR] get dbConn fail")
                                           }

                                          sql := ""
                                          sql = fmt.Sprintf(
                                               "insert into host(hostname, ip, community) values ('%s', '%s', '%s') on duplicate key update ip='%s', community='%s'",
                                               val.ReportRequest.Hostname,
                                               val.ReportRequest.IP,
                                               val.ReportRequest.Community,
                                               val.ReportRequest.IP,
                                               val.ReportRequest.Community,

                                           )

                                          _, err2 := dbConn.Exec(sql)
                                          if err2 != nil {
                                          log.Println("err exec failure")

}