GO MySQL数据库操作封装

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值