daShangDao_planA/initialization/mysql/mysql.go

176 lines
3.7 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package mysql
import (
"fmt"
"planA/initialization/golabl"
"time"
mysqlModle "planA/type/mysql"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
// Init 初始化数据库连接
// @return error 错误信息
func Init() error {
//mysql
mysqlDBInitErr := mysqlDBInit()
if mysqlDBInitErr != nil {
return mysqlDBInitErr
}
//psiMysqlInit
psiMysqlInitErr := psiMysqlInit()
if psiMysqlInitErr != nil {
return psiMysqlInitErr
}
return nil
}
// mysqlDBInit
func mysqlDBInit() error {
// 1. 获取mysql配置
mysqlConfig := golabl.Config.MysqlConfig
// 2. 配置 DSN
dsn := fmt.Sprintf(
"%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
mysqlConfig.User,
mysqlConfig.Password,
mysqlConfig.Host,
mysqlConfig.Port,
mysqlConfig.DBName,
)
// 3. 配置 GORM 连接选项
logLevel := logger.Silent
switch mysqlConfig.Loglevel {
case "info":
logLevel = logger.Info
case "warn":
logLevel = logger.Warn
case "error":
logLevel = logger.Error
case "silent":
logLevel = logger.Silent
}
gormConfig := &gorm.Config{
Logger: logger.Default.LogMode(logLevel), //日志级别
DisableForeignKeyConstraintWhenMigrating: true, //不创建外键约束
}
// 4. 连接数据库
db, openErr := gorm.Open(mysql.Open(dsn), gormConfig)
if openErr != nil {
return openErr
}
// 5. 获取底层 sql.DB配置连接池
sqlDB, dbErr := db.DB()
if dbErr != nil {
return dbErr
}
// 连接池优化 + 保活配置
sqlDB.SetMaxOpenConns(mysqlConfig.MaxOpenConns)
sqlDB.SetMaxIdleConns(mysqlConfig.MaxIdleConns)
sqlDB.SetConnMaxIdleTime(mysqlConfig.ConnMaxIdleTime * time.Minute)
sqlDB.SetConnMaxLifetime(mysqlConfig.ConnMaxLifetime * time.Hour)
// 5. 验证连接
if dbPingErr := sqlDB.Ping(); dbPingErr != nil {
return dbPingErr
}
// 6. 迁移表结构
if migrateErr := Migrate(db); migrateErr != nil {
return migrateErr
}
// 7. 保存db实例
golabl.MysqlDb = db
return nil
}
// Migrate 迁移表
func Migrate(db *gorm.DB) error {
// task_records表
if err := mysqlModle.MigrateTaskRecords(db); err != nil {
return err
}
// task_export表
if err := mysqlModle.MigrateTaskExport(db); err != nil {
return err
}
// del_task表
if err := mysqlModle.MigrateDelTask(db); err != nil {
return err
}
return nil
}
// psiMysql
func psiMysqlInit() error {
// 1. 获取mysql配置
mysqlConfig := golabl.Config.PsiMysqlConfig
// 2. 配置 DSN
dsn := fmt.Sprintf(
"%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
mysqlConfig.User,
mysqlConfig.Password,
mysqlConfig.Host,
mysqlConfig.Port,
mysqlConfig.DBName,
)
// 3. 配置 GORM 连接选项
logLevel := logger.Silent
switch mysqlConfig.Loglevel {
case "info":
logLevel = logger.Info
case "warn":
logLevel = logger.Warn
case "error":
logLevel = logger.Error
case "silent":
logLevel = logger.Silent
}
gormConfig := &gorm.Config{
Logger: logger.Default.LogMode(logLevel), //日志级别
DisableForeignKeyConstraintWhenMigrating: true, //不创建外键约束
}
// 4. 连接数据库
db, openErr := gorm.Open(mysql.Open(dsn), gormConfig)
if openErr != nil {
return openErr
}
// 5. 获取底层 sql.DB配置连接池
sqlDB, dbErr := db.DB()
if dbErr != nil {
return dbErr
}
// 连接池优化 + 保活配置
sqlDB.SetMaxOpenConns(mysqlConfig.MaxOpenConns)
sqlDB.SetMaxIdleConns(mysqlConfig.MaxIdleConns)
sqlDB.SetConnMaxIdleTime(mysqlConfig.ConnMaxIdleTime * time.Minute)
sqlDB.SetConnMaxLifetime(mysqlConfig.ConnMaxLifetime * time.Hour)
// 5. 验证连接
if dbPingErr := sqlDB.Ping(); dbPingErr != nil {
return dbPingErr
}
// 7. 保存db实例
golabl.PsiMysqlDb = db
return nil
}