Files
core/database/new.go

120 lines
2.8 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"
2026-06-20 23:29:58 +08:00
dbsql "git.apinb.com/bsm-sdk/core/database/sql"
2025-09-18 13:56:58 +08:00
"git.apinb.com/bsm-sdk/core/types"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var (
2025-10-03 19:55:20 +08:00
// MigrateTables 存储需要在数据库初始化时自动迁移的表
2025-10-05 15:00:07 +08:00
MigrateTables []any
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
}
2026-06-20 23:29:58 +08:00
func firstDSN(dsn []string) (string, error) {
if len(dsn) == 0 || strings.TrimSpace(dsn[0]) == "" {
return "", fmt.Errorf("database dsn is empty")
2025-09-18 13:56:58 +08:00
}
2026-06-20 23:29:58 +08:00
return dsn[0], nil
}
2025-09-18 13:56:58 +08:00
2026-06-20 23:29:58 +08:00
func applySqlOptions(gormDb *gorm.DB, options *types.SqlOptions) (*gorm.DB, error) {
2025-09-18 13:56:58 +08:00
if options.Debug {
gormDb = gormDb.Debug()
}
sqlDB, err := gormDb.DB()
if err != nil {
return nil, err
}
2025-09-18 13:56:58 +08:00
sqlDB.SetMaxIdleConns(options.MaxIdleConns)
sqlDB.SetMaxOpenConns(options.MaxOpenConns)
sqlDB.SetConnMaxLifetime(options.ConnMaxLifetime)
return gormDb, nil
}
2026-06-20 23:29:58 +08:00
// NewMysql 创建MySQL数据库服务
2025-10-03 19:55:20 +08:00
// dsn: 数据源名称数组
// options: 数据库连接选项
// 返回: GORM数据库实例
2026-06-20 23:29:58 +08:00
func NewMysql(dsn []string, options *types.SqlOptions) (gormDb *gorm.DB, err error) {
options = dbsql.SetOptions(options)
2025-09-18 13:56:58 +08:00
2026-06-20 23:29:58 +08:00
dsn0, err := firstDSN(dsn)
2025-09-18 13:56:58 +08:00
if err != nil {
return nil, err
}
2026-06-20 23:29:58 +08:00
gormDb, err = gorm.Open(mysql.Open(dsn0), &gorm.Config{
SkipDefaultTransaction: true,
})
if err != nil {
return nil, err
2025-09-18 13:56:58 +08:00
}
2026-06-20 23:29:58 +08:00
return applySqlOptions(gormDb, options)
}
// NewPostgres 创建PostgreSQL数据库服务
// dsn: 数据源名称数组
// options: 数据库连接选项
// 返回: GORM数据库实例
func NewPostgres(dsn []string, options *types.SqlOptions) (gormDb *gorm.DB, err error) {
dsn0, err := firstDSN(dsn)
if err != nil {
return nil, err
}
2026-06-20 23:29:58 +08:00
return dbsql.NewPostgreSql(dsn0, options)
}
2025-10-05 14:57:17 +08:00
// AppendMigrate 调用此函数后,会在数据库初始化时自动迁移表结构
//
// - table: 需要自动迁移的表
func AppendMigrate(table any) {
2025-10-05 15:00:07 +08:00
if MigrateTables == nil {
MigrateTables = make([]any, 0)
}
2025-10-05 14:57:17 +08:00
MigrateTables = append(MigrateTables, table)
}