83 lines
1.5 KiB
Go
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")
|
|
}
|
|
}
|