Files
backend/pkg/database/manager.go

60 lines
1.5 KiB
Go
Raw Normal View History

package database
import (
"fmt"
"carrotskin/internal/model"
"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
}