2026-08-15 07:41:11 +08:00
|
|
|
|
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 并按环境处理表结构:
|
2026-08-15 17:04:47 +08:00
|
|
|
|
// dev 自动迁移 File + User(及可选业务表);prod 严禁 DDL,缺 users/pms_files 直接报错。
|
2026-08-15 07:41:11 +08:00
|
|
|
|
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" {
|
2026-08-15 17:04:47 +08:00
|
|
|
|
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 {
|
2026-08-15 07:41:11 +08:00
|
|
|
|
return nil, fmt.Errorf("dev 自动迁移失败: %w", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
return db, nil
|
|
|
|
|
|
}
|
2026-08-15 17:04:47 +08:00
|
|
|
|
if !db.Migrator().HasTable(&model.User{}) {
|
|
|
|
|
|
return nil, errors.New("缺少 users 表:生产环境启动不执行迁移,请先手工执行 init.sql")
|
|
|
|
|
|
}
|
2026-08-15 07:41:11 +08:00
|
|
|
|
if !db.Migrator().HasTable(&model.File{}) {
|
|
|
|
|
|
return nil, errors.New("缺少 pms_files 表:生产环境启动不执行迁移,请先手工执行 init.sql")
|
|
|
|
|
|
}
|
|
|
|
|
|
return db, nil
|
|
|
|
|
|
}
|