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

}


猜你喜欢

转载自blog.csdn.net/daiqinge/article/details/80006813
今日推荐