Go 语言操作数据库,
数据库连接封装:
package Test_db
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"log"
"sync"
)
var (
DB *sql.DB
poolOnce sync.Once
)
func NewConnection() (*sql.DB, error) {
m_db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/Test")
if err != nil {
// fmt.Println("数据源的名称不合法!")
log.Fatalln("db connect err:", err)
return nil, err
}
//Ping检查与数据库的连接是否仍有效,如果需要会创建连接。
connect_err := m_db.Ping()
if connect_err != nil {
log.Fatalf("连接失败!error:%v", connect_err)
return nil, err
}
// fmt.Println("连接数据库成功")
m_db.SetMaxIdleConns(100)
m_db.SetMaxOpenConns(300)
// m_db.SetConnMaxLifetime(time.Second * 300)
m_db.SetConnMaxLifetime(0)
DB = m_db
//结构体实例化
GetDBStats()
return m_db, nil
}
func GetDB() (*sql.DB, error) {
var err error
poolOnce.Do(func() {
DB, err = NewConnection()
if err != nil {
fmt.Println("Connection err :", err)
}
})
err = DB.Ping()
if err != nil {
DB.Close()
DB, err = NewConnection()
if err != nil {
return nil, err
}
}
return DB, nil
}
func GetDBStats() {
info1 := fmt.Sprintf("数据库状态 :\n最大连接数:%d, 当前总连接数;%d, 已使用: %d, 空闲数量:%d \n",
DB.Stats().MaxOpenConnections,
DB.Stats().OpenConnections,
DB.Stats().InUse,
DB.Stats().Idle)
info2 := fmt.Sprintf("等待连接数量:%d, 等待创建新连接时长(秒):%f, 空闲超限关闭数量:%d, 空闲超时关闭数量:%d, 连接超时关闭数量:%d \n",
DB.Stats().WaitCount,
DB.Stats().WaitDuration.Seconds(),
DB.Stats().MaxIdleClosed,
DB.Stats().MaxIdleTimeClosed,
DB.Stats().MaxLifetimeClosed,
)
info := info1 + info2
_, _ = fmt.Println(info)
}
数据库操作封装:
package Test_db
import (
"database/sql"
"encoding/json"
"errors"
"fmt"
"log"
"reflect"
"strings"
utils
)
func QueryRecord(sql string) (string, error) {
conn, err := GetDB()
if err != nil {
return " ", err
}
stm, pre_err := conn.Prepare(sql)
if pre_err != nil {
return " ", errors.New("QueryRecord prepare err: " + pre_err.Error())
}
defer stm.Close()
rows, err := stm.Query()