89 lines
2.2 KiB
Go
89 lines
2.2 KiB
Go
|
|
package database
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"fmt"
|
|||
|
|
"log"
|
|||
|
|
"os"
|
|||
|
|
"time"
|
|||
|
|
|
|||
|
|
"github.com/Nanqipro/YunQue-Tech-Projects/ai_english_learning/serve/config"
|
|||
|
|
"gorm.io/driver/mysql"
|
|||
|
|
"gorm.io/gorm"
|
|||
|
|
"gorm.io/gorm/logger"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
var DB *gorm.DB
|
|||
|
|
|
|||
|
|
// InitDatabase 初始化数据库连接
|
|||
|
|
func InitDatabase() {
|
|||
|
|
cfg := config.GlobalConfig
|
|||
|
|
|
|||
|
|
// 构建DSN
|
|||
|
|
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=True&loc=Local&multiStatements=true",
|
|||
|
|
cfg.Database.User,
|
|||
|
|
cfg.Database.Password,
|
|||
|
|
cfg.Database.Host,
|
|||
|
|
cfg.Database.Port,
|
|||
|
|
cfg.Database.DBName,
|
|||
|
|
cfg.Database.Charset,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// 配置GORM日志 - 使用自定义logger输出详细的SQL日志
|
|||
|
|
gormLogger := logger.New(
|
|||
|
|
log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
|
|||
|
|
logger.Config{
|
|||
|
|
SlowThreshold: time.Second, // 慢SQL阈值
|
|||
|
|
LogLevel: logger.Info, // 日志级别:Info会显示所有SQL
|
|||
|
|
IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound错误
|
|||
|
|
Colorful: true, // 彩色输出
|
|||
|
|
},
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// 连接数据库
|
|||
|
|
var err error
|
|||
|
|
DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
|
|||
|
|
Logger: gormLogger,
|
|||
|
|
DisableForeignKeyConstraintWhenMigrating: true,
|
|||
|
|
})
|
|||
|
|
if err != nil {
|
|||
|
|
log.Fatalf("Failed to connect to database: %v", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取底层sql.DB对象进行连接池配置
|
|||
|
|
sqlDB, err := DB.DB()
|
|||
|
|
if err != nil {
|
|||
|
|
log.Fatalf("Failed to get underlying sql.DB: %v", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 设置连接池参数
|
|||
|
|
sqlDB.SetMaxIdleConns(10) // 最大空闲连接数
|
|||
|
|
sqlDB.SetMaxOpenConns(100) // 最大打开连接数
|
|||
|
|
sqlDB.SetConnMaxLifetime(time.Hour) // 连接最大生存时间
|
|||
|
|
sqlDB.SetConnMaxIdleTime(time.Minute * 30) // 连接最大空闲时间
|
|||
|
|
|
|||
|
|
// 测试连接
|
|||
|
|
if err := sqlDB.Ping(); err != nil {
|
|||
|
|
log.Fatalf("Failed to ping database: %v", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
log.Println("Database connected successfully")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// CloseDatabase 关闭数据库连接
|
|||
|
|
func CloseDatabase() {
|
|||
|
|
if DB != nil {
|
|||
|
|
sqlDB, err := DB.DB()
|
|||
|
|
if err != nil {
|
|||
|
|
log.Printf("Failed to get underlying sql.DB: %v", err)
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
if err := sqlDB.Close(); err != nil {
|
|||
|
|
log.Printf("Failed to close database: %v", err)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetDB 获取数据库实例
|
|||
|
|
func GetDB() *gorm.DB {
|
|||
|
|
return DB
|
|||
|
|
}
|