// Package models 提供数据库初始化和连接管理功能 package models import ( "fmt" "log" "excel-api/config" "gorm.io/driver/mysql" "gorm.io/gorm" ) // DB 全局数据库连接实例 var DB *gorm.DB // InitDB 初始化数据库连接 // 读取配置文件中的数据库连接信息,建立MySQL连接并自动迁移表结构 func InitDB() error { cfg := config.App.Database // 构建MySQL DSN(Data Source Name)连接字符串 dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=True&loc=Local", cfg.Username, cfg.Password, cfg.Host, cfg.Port, cfg.DBName, cfg.Charset, ) var err error DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { return fmt.Errorf("数据库连接失败: %w", err) } // 获取底层 *sql.DB 用于配置连接池 sqlDB, err := DB.DB() if err != nil { return fmt.Errorf("获取数据库连接池失败: %w", err) } // 设置连接池参数 sqlDB.SetMaxIdleConns(10) // 最大空闲连接数 sqlDB.SetMaxOpenConns(100) // 最大打开连接数 // 自动迁移:根据模型结构体创建/更新数据库表 // 注意:AutoMigrate 仅创建表和添加缺失列,不会删除已有列 // 完整的表结构变更请参照根目录 init.sql 文件 err = DB.AutoMigrate( &User{}, &Role{}, &Permission{}, &RolePermission{}, &UserRole{}, &Document{}, &Workbook{}, &Sheet{}, &Cell{}, &DocumentRole{}, &UserDocument{}, &WorkbookPermission{}, &OperationLog{}, &ShareLink{}, &Comment{}, &Notification{}, &Tag{}, &DocumentTag{}, &Folder{}, &FileUpload{}, &Version{}, &CollaborationSession{}, &ExportHistory{}, &Setting{}, &ApiKey{}, &AuditLog{}, ) if err != nil { return fmt.Errorf("数据库迁移失败: %w", err) } log.Println("数据库连接成功,表结构迁移完成") return nil }