package factory import ( "database/sql" "fmt" "io" "git.x2erp.com/qdy/go-base/config" "git.x2erp.com/qdy/go-base/types" "git.x2erp.com/qdy/go-db/drivers" ) // DBFactory 数据库工厂 type DBFactory struct { config config.IConfig } // NewDBFactory 创建数据库工厂 func NewDBFactory() (*DBFactory, error) { // 使用配置单例 哪里都可以直接使用 cfg := config.GetConfig() // 检查配置初始化是否有错误 if err := config.GetInitError(); err != nil { return nil, fmt.Errorf("failed to load config: %v", err) } // 检查数据库配置是否完整 if !cfg.IsDatabaseConfigured() { return nil, fmt.Errorf("database configuration is incomplete") } return &DBFactory{config: cfg}, nil } // CreateDB 创建数据库连接 func (f *DBFactory) CreateDB() (*sql.DB, error) { dbConfig := f.config.GetDatabase() dbType := dbConfig.Type // 获取对应的驱动 dbDriver, err := drivers.Get(dbType) if err != nil { return nil, fmt.Errorf("failed to get database driver: %v", err) } // 将内部 DBConfig 转换为 drivers.DBConfig driverConfig := drivers.DBConfig{ Type: dbConfig.Type, Host: dbConfig.Host, Port: dbConfig.Port, Username: dbConfig.Username, Password: dbConfig.Password, Database: dbConfig.Database, MaxOpenConns: dbConfig.MaxOpenConns, MaxIdleConns: dbConfig.MaxIdleConns, ConnMaxLifetime: dbConfig.ConnMaxLifetime, } // 创建数据库连接 db, err := dbDriver.Open(driverConfig) if err != nil { return nil, fmt.Errorf("failed to open database connection: %v", err) } return db, nil } // GetConfig 获取配置信息 func (f *DBFactory) GetConfig() config.IConfig { return f.config } // GetAvailableDrivers 获取可用的数据库驱动 func (f *DBFactory) GetAvailableDrivers() []string { return drivers.GetAllDrivers() } // CreateQueryExecutor 创建查询执行器 // func (f *DBFactory) CreateQueryExecutor(db *sql.DB) *QueryExecutor { // return newQueryExecutor(db) // } // -------------- 对外暴露的初始化方法(核心入口)-------------- // NewDBQuery 初始化查询实例(对外提供唯一初始化入口) // db: 已初始化的数据库连接(由调用方传入,解耦数据库配置) func newDBQuery(db *sql.DB) *QueryExecutor { return newQueryExecutor(db) } // QuickQueryToJSON 快捷查询,直接返回 JSON 字节流 func QueryToJSON(db *sql.DB, sql string) *types.QueryResult { return newDBQuery(db).QueryToJSON(sql) } // QuickQueryToCSV 快捷查询,直接返回 CSV 字符串(包含表头) func QueryToCSV(db *sql.DB, sql string) ([]byte, error) { return newDBQuery(db).QueryToCSV(sql) } // QuickExecuteWithColumns 快捷查询,返回完整结果(含列信息) func QueryWithColumns(db *sql.DB, sql string) *types.QueryResult { return newDBQuery(db).ExecuteQueryWithColumns(sql) } // QuickExecuteDataOnly 快捷查询,返回纯数据(性能优先) func QueryDataOnly(db *sql.DB, sql string) *types.QueryResult { return newDBQuery(db).ExecuteQueryDataOnly(sql) } // QuickExecuteCSV 快捷查询,返回 CSV 格式结果(支持自定义是否包含表头) func QueryCSV(db *sql.DB, sql string, includeHeader bool) *types.QueryResult { return newDBQuery(db).ExecuteQueryCSV(sql, includeHeader) } // QuickExecuteCSVStream 快捷流式输出 CSV(直接写入 io.Writer,适合大文件) func QueryCSVStream(db *sql.DB, sql string, w io.Writer, includeHeader bool) (int, error) { return newDBQuery(db).ExecuteQueryCSVStream(sql, w, includeHeader) } // QuickExecuteDDL 快捷执行DDL语句 func ExecuteDDL(db *sql.DB, ddlSQL string) error { factory := &DBFactory{} return factory.ExecuteDDL(db, ddlSQL) } // QuickExecuteDDLWithTx 快捷在事务中执行DDL语句 func ExecuteDDLWithTx(db *sql.DB, ddlSQL string) error { factory := &DBFactory{} return factory.ExecuteDDLWithTx(db, ddlSQL) } // QuickExecuteMultipleDDL 快捷执行多个DDL语句 func ExecuteMultipleDDL(db *sql.DB, ddlSQLs []string) error { factory := &DBFactory{} return factory.ExecuteMultipleDDL(db, ddlSQLs) }