64 lines
1.8 KiB
Go
64 lines
1.8 KiB
Go
package initialize
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/dungnt11/todoms_golang/global"
|
|
"github.com/dungnt11/todoms_golang/internal/models"
|
|
"go.uber.org/zap"
|
|
"gorm.io/driver/mysql"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// checkErrorPanic kiểm tra lỗi và gọi panic nếu có lỗi, đồng thời ghi log chi tiết.
|
|
func checkErrorPanic(err error, errString string) {
|
|
if err != nil {
|
|
global.Logger.Error(errString, zap.Error(err))
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
// InitMysql khởi tạo kết nối đến cơ sở dữ liệu MySQL và trả về đối tượng *gorm.DB.
|
|
func InitMysql() *gorm.DB {
|
|
m := global.Config.Database
|
|
|
|
dsn := "%s:%s@tcp(%s:%v)/%s?charset=utf8mb4&parseTime=True&loc=Local"
|
|
s := fmt.Sprintf(dsn, m.Username, m.Password, m.Host, m.Port, m.Database)
|
|
db, err := gorm.Open(mysql.Open(s), &gorm.Config{
|
|
SkipDefaultTransaction: false,
|
|
})
|
|
checkErrorPanic(err, "InitMysql initialization error")
|
|
global.Logger.Info("Initializing MySQL Successfully")
|
|
setPool(db)
|
|
return db
|
|
}
|
|
|
|
// setPool thiết lập các thông số cho connection pool của cơ sở dữ liệu.
|
|
func setPool(db *gorm.DB) {
|
|
m := global.Config.Database
|
|
sqlDb, err := db.DB()
|
|
if err != nil {
|
|
global.Logger.Error("Failed to get sql.DB from gorm.DB", zap.Error(err))
|
|
return
|
|
}
|
|
sqlDb.SetMaxIdleConns(m.MaxIdleConns)
|
|
sqlDb.SetMaxOpenConns(m.MaxOpenConns)
|
|
sqlDb.SetConnMaxLifetime(time.Duration(m.ConnMaxLifetime) * time.Second)
|
|
}
|
|
|
|
func defaultInitMysql() {
|
|
isInitUser := global.Mdb.Migrator().HasTable(&models.User{})
|
|
isInitProduct := global.Mdb.Migrator().HasTable(&models.Product{})
|
|
|
|
if !isInitUser {
|
|
global.Mdb.AutoMigrate(&models.User{})
|
|
global.Logger.Info("Initialized User table")
|
|
}
|
|
|
|
if !isInitProduct {
|
|
global.Mdb.AutoMigrate(&models.Product{})
|
|
global.Logger.Info("Initialized Product table")
|
|
}
|
|
}
|