core/database/new.go

143 lines
3.7 KiB
Go
Raw Normal View History

2025-10-03 19:55:20 +08:00
// Package database 提供数据库连接和管理功能
// 支持MySQL和PostgreSQL数据库包含连接池管理和自动迁移
2025-09-18 13:56:58 +08:00
package database
import (
"fmt"
"strings"
2025-09-18 13:56:58 +08:00
"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 (
2025-10-03 19:55:20 +08:00
// MigrateTables 存储需要在数据库初始化时自动迁移的表
2025-10-05 14:59:01 +08:00
MigrateTables []any = make([]any, 0)
2025-09-18 13:56:58 +08:00
)
2025-10-03 19:55:20 +08:00
// NewDatabase 根据提供的驱动类型创建新的数据库连接
// 支持MySQL和PostgreSQL数据库
// driver: 数据库驱动类型 ("mysql" 或 "postgres")
// dsn: 数据源名称数组
// options: 数据库连接选项
// 返回: GORM数据库实例
func NewDatabase(driver string, dsn []string, options *types.SqlOptions) (db *gorm.DB, err error) {
driver = strings.ToLower(driver)
switch driver {
case "mysql":
db, err = NewMysql(dsn, options)
case "postgres":
db, err = NewPostgres(dsn, options)
default:
return nil, fmt.Errorf("unsupported database driver: %s", driver)
}
if err != nil {
return nil, err
}
2025-10-03 19:55:20 +08:00
// 自动迁移表结构
if len(MigrateTables) > 0 {
err = db.AutoMigrate(MigrateTables...)
if err != nil {
return nil, err
}
}
return db, nil
}
2025-10-03 19:55:20 +08:00
// NewMysql 创建MySQL数据库服务
// dsn: 数据源名称数组
// options: 数据库连接选项
// 返回: GORM数据库实例
2025-09-18 13:56:58 +08:00
func NewMysql(dsn []string, options *types.SqlOptions) (gormDb *gorm.DB, err error) {
2025-10-03 19:55:20 +08:00
// 设置连接默认值
2025-09-18 13:56:58 +08:00
if options == nil {
options = &types.SqlOptions{
MaxIdleConns: vars.SqlOptionMaxIdleConns,
MaxOpenConns: vars.SqlOptionMaxOpenConns,
2025-09-18 13:56:58 +08:00
ConnMaxLifetime: vars.SqlOptionConnMaxLifetime,
LogStdout: false,
Debug: true,
}
}
gormDb, err = gorm.Open(mysql.Open(dsn[0]), &gorm.Config{
SkipDefaultTransaction: true,
})
if err != nil {
return nil, err
}
if options.Debug {
gormDb = gormDb.Debug()
}
2025-10-03 19:55:20 +08:00
// 获取通用数据库对象 sql.DB然后使用其提供的功能
sqlDB, err := gormDb.DB()
if err != nil {
return nil, err
}
2025-10-03 19:55:20 +08:00
// SetMaxIdleConns 用于设置连接池中空闲连接的最大数量
2025-09-18 13:56:58 +08:00
sqlDB.SetMaxIdleConns(options.MaxIdleConns)
2025-10-03 19:55:20 +08:00
// SetMaxOpenConns 设置打开数据库连接的最大数量
2025-09-18 13:56:58 +08:00
sqlDB.SetMaxOpenConns(options.MaxOpenConns)
2025-10-03 19:55:20 +08:00
// SetConnMaxLifetime 设置了连接可复用的最大时间
2025-09-18 13:56:58 +08:00
sqlDB.SetConnMaxLifetime(options.ConnMaxLifetime)
return gormDb, nil
}
2025-10-03 19:55:20 +08:00
// NewPostgres 创建PostgreSQL数据库服务
// dsn: 数据源名称数组
// options: 数据库连接选项
// 返回: GORM数据库实例
2025-09-18 13:56:58 +08:00
func NewPostgres(dsn []string, options *types.SqlOptions) (gormDb *gorm.DB, err error) {
2025-10-03 19:55:20 +08:00
// 设置连接默认值
2025-09-18 13:56:58 +08:00
if options == nil {
options = &types.SqlOptions{
MaxIdleConns: vars.SqlOptionMaxIdleConns,
MaxOpenConns: vars.SqlOptionMaxOpenConns,
2025-09-18 13:56:58 +08:00
ConnMaxLifetime: vars.SqlOptionConnMaxLifetime,
LogStdout: false,
Debug: true,
}
}
gormDb, err = sql.NewPostgreSql(dsn[0], options)
if err != nil {
return nil, err
}
if options.Debug {
gormDb = gormDb.Debug()
}
2025-10-03 19:55:20 +08:00
// 获取通用数据库对象 sql.DB然后使用其提供的功能
sqlDB, err := gormDb.DB()
if err != nil {
return nil, err
}
2025-10-03 19:55:20 +08:00
// SetMaxIdleConns 用于设置连接池中空闲连接的最大数量
sqlDB.SetMaxIdleConns(options.MaxIdleConns)
2025-10-03 19:55:20 +08:00
// SetMaxOpenConns 设置打开数据库连接的最大数量
sqlDB.SetMaxOpenConns(options.MaxOpenConns)
2025-10-03 19:55:20 +08:00
// SetConnMaxLifetime 设置了连接可复用的最大时间
sqlDB.SetConnMaxLifetime(options.ConnMaxLifetime)
2025-10-03 19:55:20 +08:00
return gormDb, nil
}
2025-10-05 14:57:17 +08:00
// AppendMigrate 调用此函数后,会在数据库初始化时自动迁移表结构
//
// - table: 需要自动迁移的表
func AppendMigrate(table any) {
MigrateTables = append(MigrateTables, table)
}