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