Files
full/module/base/mgt/internal/models/impl.go

165 lines
4.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package models
import (
"fmt"
"log"
"strings"
"bsm/full/module/base/mgt/internal/config"
"git.apinb.com/bsm-sdk/core/database/sql"
"git.apinb.com/bsm-sdk/core/types"
"git.apinb.com/bsm-sdk/core/vars"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var (
DBService *gorm.DB
migrateTables = []any{
&MgtUser{},
&MgtDepartment{},
&MgtRole{},
&MgtPermission{},
&MgtApplication{},
&MgtLinkUserDpt{},
&MgtLinkUserRole{},
&MgtLinkUserPmn{},
&MgtLinkUserApp{},
&MgtLinkRolePmn{},
&MgtLinkRoleApp{},
&MgtLinkDptRole{},
&MgtLinkDptPmn{},
}
)
func New(driver string, dsn []string, options *types.SqlOptions) (err error) {
driver = strings.ToLower(driver)
switch driver {
case "mysql":
DBService, err = NewMysql(dsn, options)
case "postgres":
DBService, err = NewPostgres(dsn, options)
default:
log.Fatalln("Unsupported database driver:", driver)
return
}
if err != nil {
log.Fatalln(err)
return err
}
log.Println("数据库连接成功")
// 注册自定义连接表
setupRegister()
log.Println("自定义连接表注册成功")
// 自动迁移表
err = DBService.AutoMigrate(migrateTables...)
if err != nil {
log.Fatalln(err)
return err
}
log.Println("数据表迁移成功")
// 初始化管理员数据(幂等操作,如果已存在则跳过)
if config.InitRootUserEnabled() {
InitRootUserData()
log.Println("管理员数据初始化完成(如已存在则跳过)")
} else {
log.Println("已跳过管理员数据初始化InitRootUser=false")
}
return
}
func NewMysql(dsn []string, options *types.SqlOptions) (gormDb *gorm.DB, err error) {
//set connection default val.
if options == nil {
maxIdleConns := vars.SqlOptionMaxIdleConns
// MaxOpenConns 应该大于 MaxIdleConns通常设置为 MaxIdleConns * 2 或更大
maxOpenConns := maxIdleConns * 2
if maxOpenConns < 10 {
maxOpenConns = 10 // 确保最小值
}
options = &types.SqlOptions{
MaxIdleConns: maxIdleConns,
MaxOpenConns: maxOpenConns,
ConnMaxLifetime: vars.SqlOptionConnMaxLifetime,
LogStdout: false,
Debug: true,
}
} else {
// 如果传入了options但MaxOpenConns未设置或小于MaxIdleConns则自动调整
if options.MaxOpenConns <= 0 || options.MaxOpenConns < options.MaxIdleConns {
maxOpenConns := options.MaxIdleConns * 2
if maxOpenConns < 10 {
maxOpenConns = 10
}
options.MaxOpenConns = maxOpenConns
}
}
gormDb, err = gorm.Open(mysql.Open(dsn[0]), &gorm.Config{
SkipDefaultTransaction: true,
})
if err != nil {
return nil, err
}
if options.Debug {
gormDb = gormDb.Debug()
}
// 获取通用数据库对象 sql.DB ,然后使用其提供的功能
sqlDB, _ := gormDb.DB()
// SetMaxIdleConns 用于设置连接池中空闲连接的最大数量。
sqlDB.SetMaxIdleConns(options.MaxIdleConns)
// SetMaxOpenConns 设置打开数据库连接的最大数量。
sqlDB.SetMaxOpenConns(options.MaxOpenConns)
// SetConnMaxLifetime 设置了连接可复用的最大时间。
sqlDB.SetConnMaxLifetime(options.ConnMaxLifetime)
return gormDb, nil
}
func NewPostgres(dsn []string, options *types.SqlOptions) (gormDb *gorm.DB, err error) {
fmt.Println(dsn[0])
//set connection default val.
if options == nil {
maxIdleConns := vars.SqlOptionMaxIdleConns
// MaxOpenConns 应该大于 MaxIdleConns通常设置为 MaxIdleConns * 2 或更大
maxOpenConns := maxIdleConns * 2
if maxOpenConns < 10 {
maxOpenConns = 10 // 确保最小值
}
options = &types.SqlOptions{
MaxIdleConns: maxIdleConns,
MaxOpenConns: maxOpenConns,
ConnMaxLifetime: vars.SqlOptionConnMaxLifetime,
LogStdout: false,
Debug: true,
}
} else {
// 如果传入了options但MaxOpenConns未设置或小于MaxIdleConns则自动调整
if options.MaxOpenConns <= 0 || options.MaxOpenConns < options.MaxIdleConns {
maxOpenConns := options.MaxIdleConns * 2
if maxOpenConns < 10 {
maxOpenConns = 10
}
options.MaxOpenConns = maxOpenConns
}
}
db, err := sql.NewPostgreSql(dsn[0], options)
if err != nil {
return nil, err
}
return db, nil
}