84 lines
1.8 KiB
Go
84 lines
1.8 KiB
Go
|
|
// 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
|
|||
|
|
}
|