feat(db): 添加数据库配置自动查找和缓存功能

- 实现配置文件自动查找功能,支持yaml、yml、toml、ini、json格式
- 添加查询缓存机制,提高重复查询性能
- 新增构建脚本build.sh和build.bat用于跨平台编译
- 添加完整的数据库连接配置和时间字段配置功能
- 实现DAO基类提供通用CRUD操作方法
- 添加配置文件示例和相关测试用例
This commit is contained in:
2026-04-03 07:39:18 +08:00
parent f50930ec74
commit b52c4aa3c7
48 changed files with 8888 additions and 1 deletions
+153
View File
@@ -0,0 +1,153 @@
package driver
import (
"database/sql"
"database/sql/driver"
"errors"
"sync"
)
// IDriverManager 驱动管理器接口 - 统一管理所有数据库驱动的注册和使用
type IDriverManager interface {
// 注册驱动
Register(name string, d driver.Driver) error // 注册一个新的数据库驱动
// 获取驱动
GetDriver(name string) (driver.Driver, error) // 根据名称获取已注册的驱动
// 列出所有驱动
ListDrivers() []string // 列出所有已注册的驱动名称
// 打开数据库连接
Open(driverName, dataSource string) (*sql.DB, error) // 使用指定驱动打开数据库连接
}
// DriverManager 驱动管理器实现 - 管理所有数据库驱动的生命周期
type DriverManager struct {
mu sync.RWMutex // 读写锁,保证并发安全
drivers map[string]driver.Driver // 存储所有已注册的驱动
sqlDBs map[string]*sql.DB // 存储已创建的数据库连接池
}
var defaultManager *DriverManager // 默认驱动管理器实例
var once sync.Once // 单例模式同步控制
// GetDefaultManager 获取默认驱动管理器 - 使用单例模式确保全局唯一实例
func GetDefaultManager() *DriverManager {
once.Do(func() {
defaultManager = &DriverManager{
drivers: make(map[string]driver.Driver), // 初始化驱动映射表
sqlDBs: make(map[string]*sql.DB), // 初始化连接池映射表
}
// 注册所有内置驱动
defaultManager.registerBuiltinDrivers()
})
return defaultManager
}
// registerBuiltinDrivers 注册所有内置驱动 - 自动注册框架自带的所有数据库驱动
func (dm *DriverManager) registerBuiltinDrivers() {
// TODO: 注册 MySQL 驱动
// dm.Register("mysql", &MySQLDriver{})
// TODO: 注册 SQLite 驱动
// dm.Register("sqlite", &SQLiteDriver{})
// TODO: 注册 PostgreSQL 驱动
// dm.Register("postgres", &PostgresDriver{})
// TODO: 注册 SQL Server 驱动
// dm.Register("sqlserver", &SQLServerDriver{})
// TODO: 注册 Oracle 驱动
// dm.Register("oracle", &OracleDriver{})
// TODO: 注册 ClickHouse 驱动
// dm.Register("clickhouse", &ClickHouseDriver{})
}
// Register 注册驱动 - 将新的数据库驱动注册到管理器中
func (dm *DriverManager) Register(name string, d driver.Driver) error {
dm.mu.Lock()
defer dm.mu.Unlock()
if _, exists := dm.drivers[name]; exists {
return nil // 已存在,不重复注册
}
dm.drivers[name] = d
return nil
}
// GetDriver 获取驱动 - 根据驱动名称查找并返回已注册的驱动
func (dm *DriverManager) GetDriver(name string) (driver.Driver, error) {
dm.mu.RLock()
defer dm.mu.RUnlock()
d, exists := dm.drivers[name]
if !exists {
return nil, ErrDriverNotFound // 驱动未找到错误
}
return d, nil
}
// ListDrivers 列出所有驱动 - 返回所有已注册的驱动名称列表
func (dm *DriverManager) ListDrivers() []string {
dm.mu.RLock()
defer dm.mu.RUnlock()
names := make([]string, 0, len(dm.drivers))
for name := range dm.drivers {
names = append(names, name)
}
return names
}
// Open 打开数据库连接 - 使用指定驱动和数据源创建数据库连接池
func (dm *DriverManager) Open(driverName, dataSource string) (*sql.DB, error) {
dm.mu.Lock()
defer dm.mu.Unlock()
// 检查是否已有连接(避免重复创建)
key := driverName + ":" + dataSource
if db, exists := dm.sqlDBs[key]; exists {
return db, nil
}
// 获取驱动
d, err := dm.GetDriver(driverName)
if err != nil {
return nil, err
}
// 创建连接器(需要驱动实现 Connector 接口)
connector, ok := d.(driver.Connector)
if !ok {
return nil, ErrDriverNotConnector // 驱动不支持 Connector 接口
}
// 创建 sql.DB 连接池
db := sql.OpenDB(connector)
dm.sqlDBs[key] = db
return db, nil
}
// Close 关闭指定连接 - 释放特定数据源的数据库连接池
func (dm *DriverManager) Close(driverName, dataSource string) error {
dm.mu.Lock()
defer dm.mu.Unlock()
key := driverName + ":" + dataSource
if db, exists := dm.sqlDBs[key]; exists {
if err := db.Close(); err != nil {
return err
}
delete(dm.sqlDBs, key)
}
return nil
}
// 错误定义 - 定义驱动管理器相关的错误类型
var (
ErrDriverNotFound = errors.New("driver not found") // 驱动未找到错误
ErrDriverNotConnector = errors.New("driver does not implement Connector interface") // 驱动不支持 Connector 接口错误
)
+30
View File
@@ -0,0 +1,30 @@
package driver
import (
"database/sql"
"database/sql/driver"
sqlite3 "github.com/mattn/go-sqlite3"
)
// SQLiteDriver SQLite 数据库驱动实现
type SQLiteDriver struct {
nativeDriver driver.Driver
}
// NewSQLiteDriver 创建 SQLite 驱动实例
func NewSQLiteDriver() *SQLiteDriver {
return &SQLiteDriver{
nativeDriver: &sqlite3.SQLiteDriver{},
}
}
// Open 打开数据库连接
func (d *SQLiteDriver) Open(name string) (driver.Conn, error) {
return d.nativeDriver.Open(name)
}
// OpenDB 打开数据库连接(使用 sql.DB)
func (d *SQLiteDriver) OpenDB(dataSourceName string) (*sql.DB, error) {
return sql.Open("sqlite3", dataSourceName)
}