Files

83 lines
1.5 KiB
Go

package database
import (
"fmt"
"log"
"smart-customer-service/config"
"smart-customer-service/internal/models"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
var DB *gorm.DB
// Init 初始化数据库连接
func Init(cfg *config.Config) error {
dsn := cfg.GetDSN()
// 设置日志级别
var logLevel logger.LogLevel
if cfg.Server.Mode == "debug" {
logLevel = logger.Info
} else {
logLevel = logger.Warn
}
var err error
// 连接 MySQL 数据库
DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logLevel),
DisableForeignKeyConstraintWhenMigrating: true,
})
if err != nil {
return fmt.Errorf("failed to connect to database: %w", err)
}
log.Println("✅ Database connection established")
// 自动迁移模型
if err := Migrate(cfg); err != nil {
return fmt.Errorf("failed to migrate database: %w", err)
}
log.Println("✅ Database migration completed")
return nil
}
// Migrate 执行数据库迁移
func Migrate(cfg *config.Config) error {
// 全局模型
if err := DB.AutoMigrate(
// 租户体系
&models.Tenant{},
&models.User{},
&models.Role{},
&models.Resource{},
&models.RoleResource{},
&models.UserRole{},
// 业务模型
&models.Conversation{},
&models.Message{},
&models.Ticket{},
&models.KnowledgeBase{},
&models.KnowledgeItem{},
); err != nil {
return err
}
return nil
}
// Close 关闭数据库连接
func Close() {
if DB != nil {
db, _ := DB.DB()
db.Close()
log.Println("✅ Database connection closed")
}
}