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
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")
}