gin-base/db/core/database.go

129 lines
3.3 KiB
Go

package core
import (
"fmt"
"os"
"path/filepath"
"git.magicany.cc/black1552/gin-base/db/driver"
)
// NewDatabase 创建数据库连接 - 初始化数据库连接和相关组件
func NewDatabase(config *Config) (*Database, error) {
db := &Database{
config: config,
debug: config.Debug,
driverName: config.DriverName,
}
// 初始化时间配置
if config.TimeConfig == nil {
db.timeConfig = DefaultTimeConfig()
} else {
db.timeConfig = config.TimeConfig
db.timeConfig.Validate()
}
// 获取驱动管理器
dm := driver.GetDefaultManager()
// 打开数据库连接
sqlDB, err := dm.Open(config.DriverName, config.DataSource)
if err != nil {
return nil, fmt.Errorf("打开数据库失败:%w", err)
}
db.db = sqlDB
// 配置连接池参数
if config.MaxIdleConns > 0 {
db.db.SetMaxIdleConns(config.MaxIdleConns)
}
if config.MaxOpenConns > 0 {
db.db.SetMaxOpenConns(config.MaxOpenConns)
}
if config.ConnMaxLifetime > 0 {
db.db.SetConnMaxLifetime(config.ConnMaxLifetime)
}
// 测试数据库连接
if err := db.db.Ping(); err != nil {
return nil, fmt.Errorf("数据库连接测试失败:%w", err)
}
// 初始化组件
db.mapper = NewFieldMapper()
db.migrator = NewMigrator(db)
if config.Debug {
fmt.Println("[Magic-ORM] 数据库连接成功")
}
return db, nil
}
// AutoConnect 自动查找配置文件并创建数据库连接
// 会在当前目录及上级目录中查找 config.yaml, config.toml, config.ini, config.json 等文件
func AutoConnect(debug bool) (*Database, error) {
// 自动查找配置文件
configPath, err := findConfigFile("")
if err != nil {
return nil, fmt.Errorf("查找配置文件失败:%w", err)
}
// 从文件加载配置(使用 config 包)
return loadAndConnect(configPath, debug)
}
// Connect 从配置文件创建数据库连接(向后兼容)
// Deprecated: 使用 AutoConnect 代替
func Connect(configPath string, debug bool) (*Database, error) {
return loadAndConnect(configPath, debug)
}
// findConfigFile 在项目目录下自动查找配置文件
// 支持 yaml, yml, toml, ini, json 等格式
// 只在当前目录查找,不越级查找
func findConfigFile(searchDir string) (string, error) {
// 配置文件名优先级列表
configNames := []string{
"config.yaml", "config.yml",
"config.toml",
"config.ini",
"config.json",
".config.yaml", ".config.yml",
".config.toml",
".config.ini",
".config.json",
}
// 如果未指定搜索目录,使用当前目录
if searchDir == "" {
var err error
searchDir, err = os.Getwd()
if err != nil {
return "", fmt.Errorf("获取当前目录失败:%w", err)
}
}
// 只在当前目录下查找,不向上查找
for _, name := range configNames {
filePath := filepath.Join(searchDir, name)
if _, err := os.Stat(filePath); err == nil {
return filePath, nil
}
}
return "", fmt.Errorf("未找到配置文件(支持 yaml, yml, toml, ini, json 格式)")
}
// loadAndConnect 从配置文件加载并创建数据库连接
func loadAndConnect(configPath string, debug bool) (*Database, error) {
// 这里需要调用 config 包的 LoadFromFile
// 为了避免循环依赖,我们直接在 core 包中实现简单的 YAML 解析
// 或者通过接口传递配置
// 简单方案:返回错误,提示使用 config 包
return nil, fmt.Errorf("请使用 config.AutoConnect() 方法")
}