voucher/internal/data/gorm.go

60 lines
1.3 KiB
Go

package data
import (
"database/sql"
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"time"
"voucher/internal/conf"
)
type GormDb struct {
Client *gorm.DB
}
func NewGormDb(c *conf.Bootstrap) (*GormDb, func()) {
db1, mf := db(c.Data.Db)
cleanup := func() {
mf()
}
return &GormDb{
Client: db1,
}, cleanup
}
func db(data *conf.Data_Database) (*gorm.DB, func()) {
mysqlConn, err := sql.Open(data.Driver, data.Source)
gormDB, err := gorm.Open(
mysql.New(mysql.Config{Conn: mysqlConn}),
&gorm.Config{Logger: logger.Default.LogMode(logger.Info)},
)
if err != nil {
panic("failed to connect database " + err.Error())
}
sqlDB, err := gormDB.DB()
if err != nil {
panic("failed to gormDB " + err.Error())
}
// SetMaxIdleConns sets the maximum number of connections in the idle connection pool.
sqlDB.SetMaxIdleConns(int(data.MaxIdle))
// SetMaxOpenConns sets the maximum number of openapi connections to the database.
sqlDB.SetMaxOpenConns(int(data.MaxOpen))
// SetConnMaxLifetime sets the maximum amount of time a connection may be reused.
sqlDB.SetConnMaxLifetime(time.Hour)
return gormDB, func() {
if mysqlConn != nil {
fmt.Println("关闭 db")
if err := mysqlConn.Close(); err != nil {
fmt.Printf("关闭 db 失败:%v", err)
}
}
}
}