| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- 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).queryWithColumns(sql)
- }
-
- // QuickExecuteDataOnly 快捷查询,返回纯数据(性能优先)
- func QueryDataOnly(db *sql.DB, sql string) *types.QueryResult {
- return newDBQuery(db).queryDataOnly(sql)
- }
-
- // QuickExecuteCSV 快捷查询,返回 CSV 格式结果(支持自定义是否包含表头)
- func QueryCSV(db *sql.DB, sql string, includeHeader bool) *types.QueryResult {
- return newDBQuery(db).queryCSV(sql, includeHeader)
- }
-
- // QuickExecuteCSVStream 快捷流式输出 CSV(直接写入 io.Writer,适合大文件)
- func QueryCSVStream(db *sql.DB, sql string, w io.Writer, includeHeader bool) (int, error) {
- return newDBQuery(db).queryCSVStream(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)
- }
-
- // testConnection 测试数据库连接
- func TestConnection(db *sql.DB, dbType string) error {
- var query string
- switch dbType {
- case "mysql", "postgres", "sqlserver":
- query = "SELECT 1"
- case "oracle":
- query = "SELECT 1 FROM DUAL"
- default:
- query = "SELECT 1"
- }
-
- var result int
- err := db.QueryRow(query).Scan(&result)
- if err != nil {
- return err
- }
-
- if result != 1 {
- return fmt.Errorf("unexpected test result: %d", result)
- }
-
- return nil
- }
|