package database import ( "fmt" "time" "ezops/internal/config" "ezops/internal/models" "gorm.io/driver/mysql" "gorm.io/driver/postgres" "gorm.io/driver/sqlite" "gorm.io/gorm" "gorm.io/gorm/logger" ) // New 创建数据库连接 func New(cfg config.DatabaseConfig) (*gorm.DB, error) { var dialector gorm.Dialector switch cfg.Driver { case "mysql": dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=True&loc=Local", cfg.User, cfg.Password, cfg.Host, cfg.Port, cfg.DBName, cfg.Charset) dialector = mysql.Open(dsn) case "postgres": dsn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", cfg.Host, cfg.Port, cfg.User, cfg.Password, cfg.DBName) dialector = postgres.Open(dsn) case "sqlite": dialector = sqlite.Open(cfg.DBName) default: return nil, fmt.Errorf("unsupported database driver: %s", cfg.Driver) } db, err := gorm.Open(dialector, &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), }) if err != nil { return nil, err } // 设置连接池 sqlDB, err := db.DB() if err != nil { return nil, err } sqlDB.SetMaxOpenConns(cfg.MaxConn) sqlDB.SetMaxIdleConns(cfg.MaxIdle) sqlDB.SetConnMaxLifetime(time.Hour) return db, nil } // AutoMigrate 自动迁移数据库表 func AutoMigrate(db *gorm.DB) error { return db.AutoMigrate( &models.User{}, &models.Role{}, &models.Permission{}, &models.Server{}, &models.Cloud{}, &models.CloudAccount{}, &models.Region{}, &models.Domain{}, &models.K8sCluster{}, &models.K8sNode{}, &models.K8sPod{}, &models.K8sDeployment{}, &models.K8sService{}, &models.K8sIngress{}, &models.AlertRule{}, &models.AlertEvent{}, &models.NotifyChannel{}, &models.MetricData{}, &models.Pipeline{}, &models.PipelineRun{}, &models.AppRelease{}, &models.CronJob{}, &models.Script{}, &models.TaskExecution{}, &models.Playbook{}, &models.ApprovalTemplate{}, &models.ApprovalProcess{}, &models.ApprovalStep{}, &models.NavigationGroup{}, &models.NavigationLink{}, &models.AuditLog{}, &models.LDAPConfig{}, &models.ResourceModel{}, ) }