package database import ( "carrotskin/internal/model" "fmt" "go.uber.org/zap" "gorm.io/gorm" ) // 本文件原包含基于 sync.Once 的全局单例(Init/GetDB/MustGetDB/GetDBWrapper)。 // // 在 DI 迁移(阶段4)后,全局单例已被移除。数据库连接由 fx.Provide 构造 // (见 internal/app/infra_module.go 的 provideDatabase),通过构造函数参数 // 注入 *database.DB 与 *gorm.DB 到各消费者。 // // 数据库构造逻辑见 postgres.go 的 New()。 // AutoMigrateWithDB 使用指定的 *gorm.DB 执行表结构迁移(供 DI 使用)。 // 注意表的创建顺序:先创建被引用的表,再创建引用表。 func AutoMigrateWithDB(db *gorm.DB, logger *zap.Logger) error { logger.Info("开始执行数据库迁移...") tables := []interface{}{ // 用户相关表(先创建,因为其他表可能引用它) &model.User{}, &model.UserPointLog{}, &model.UserLoginLog{}, // 档案相关表 &model.Profile{}, // 材质相关表 &model.Texture{}, &model.UserTextureFavorite{}, &model.TextureDownloadLog{}, // 认证相关表 &model.Client{}, // Client表用于管理Token版本 // Yggdrasil相关表(在User之后创建,因为它引用User) &model.Yggdrasil{}, // 审计日志表 &model.AuditLog{}, // Casbin权限规则表 &model.CasbinRule{}, } if err := db.AutoMigrate(tables...); err != nil { logger.Error("数据库迁移失败", zap.Error(err)) return fmt.Errorf("数据库迁移失败: %w", err) } logger.Info("数据库迁移完成") return nil }