package database import ( "errors" "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "nl-pms-api/internal/config" "nl-pms-api/internal/model" ) // Open 连接 MySQL 并按环境处理表结构: // dev 自动迁移 File + User(及可选业务表);prod 严禁 DDL,缺 users/pms_files 直接报错。 func Open(cfg *config.Config) (*gorm.DB, error) { lv := logger.Warn if cfg.Env == "dev" { lv = logger.Info } db, err := gorm.Open(mysql.Open(cfg.MySQL.DSN), &gorm.Config{Logger: logger.Default.LogMode(lv)}) if err != nil { return nil, fmt.Errorf("连接 MySQL 失败: %w", err) } if cfg.Env == "dev" { if err := db.AutoMigrate( &model.User{}, &model.File{}, &model.SyncTodo{}, &model.SyncTicket{}, &model.SyncNote{}, &model.SyncSetting{}, &model.UserProfile{}, &model.UserAvatarHistory{}, &model.Team{}, &model.TeamMember{}, &model.TeamTask{}, &model.TeamReport{}, &model.TeamDigest{}, &model.TeamNotice{}, &model.UserDailyActive{}, &model.AIUsageDaily{}, &model.AppRelease{}, &model.AdminStepup{}, ); err != nil { return nil, fmt.Errorf("dev 自动迁移失败: %w", err) } return db, nil } if !db.Migrator().HasTable(&model.User{}) { return nil, errors.New("缺少 users 表:生产环境启动不执行迁移,请先手工执行 init.sql") } if !db.Migrator().HasTable(&model.File{}) { return nil, errors.New("缺少 pms_files 表:生产环境启动不执行迁移,请先手工执行 init.sql") } return db, nil }