| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- 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 QuickQueryToJSON(db *sql.DB, sql string) *types.QueryResult {
- return NewDBQuery(db).QueryToJSON(sql)
- }
-
- // QuickQueryToCSV 快捷查询,直接返回 CSV 字符串(包含表头)
- func QuickQueryToCSV(db *sql.DB, sql string) ([]byte, error) {
- return NewDBQuery(db).QueryToCSV(sql)
- }
-
- // QuickExecuteWithColumns 快捷查询,返回完整结果(含列信息)
- func QuickExecuteWithColumns(db *sql.DB, sql string) *types.QueryResult {
- return NewDBQuery(db).ExecuteQueryWithColumns(sql)
- }
-
- // QuickExecuteDataOnly 快捷查询,返回纯数据(性能优先)
- func QuickExecuteDataOnly(db *sql.DB, sql string) *types.QueryResult {
- return NewDBQuery(db).ExecuteQueryDataOnly(sql)
- }
-
- // QuickExecuteCSV 快捷查询,返回 CSV 格式结果(支持自定义是否包含表头)
- func QuickExecuteCSV(db *sql.DB, sql string, includeHeader bool) *types.QueryResult {
- return NewDBQuery(db).ExecuteQueryCSV(sql, includeHeader)
- }
-
- // QuickExecuteCSVStream 快捷流式输出 CSV(直接写入 io.Writer,适合大文件)
- func QuickExecuteCSVStream(db *sql.DB, sql string, w io.Writer, includeHeader bool) (int, error) {
- return NewDBQuery(db).ExecuteQueryCSVStream(sql, w, includeHeader)
- }
|