Нет описания
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

factory.go 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package factory
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "io"
  6. "git.x2erp.com/qdy/go-base/config"
  7. "git.x2erp.com/qdy/go-base/types"
  8. "git.x2erp.com/qdy/go-db/drivers"
  9. )
  10. // DBFactory 数据库工厂
  11. type DBFactory struct {
  12. config config.IConfig
  13. }
  14. // NewDBFactory 创建数据库工厂
  15. func NewDBFactory() (*DBFactory, error) {
  16. // 使用配置单例 哪里都可以直接使用
  17. cfg := config.GetConfig()
  18. // 检查配置初始化是否有错误
  19. if err := config.GetInitError(); err != nil {
  20. return nil, fmt.Errorf("failed to load config: %v", err)
  21. }
  22. // 检查数据库配置是否完整
  23. if !cfg.IsDatabaseConfigured() {
  24. return nil, fmt.Errorf("database configuration is incomplete")
  25. }
  26. return &DBFactory{config: cfg}, nil
  27. }
  28. // CreateDB 创建数据库连接
  29. func (f *DBFactory) CreateDB() (*sql.DB, error) {
  30. dbConfig := f.config.GetDatabase()
  31. dbType := dbConfig.Type
  32. // 获取对应的驱动
  33. dbDriver, err := drivers.Get(dbType)
  34. if err != nil {
  35. return nil, fmt.Errorf("failed to get database driver: %v", err)
  36. }
  37. // 将内部 DBConfig 转换为 drivers.DBConfig
  38. driverConfig := drivers.DBConfig{
  39. Type: dbConfig.Type,
  40. Host: dbConfig.Host,
  41. Port: dbConfig.Port,
  42. Username: dbConfig.Username,
  43. Password: dbConfig.Password,
  44. Database: dbConfig.Database,
  45. MaxOpenConns: dbConfig.MaxOpenConns,
  46. MaxIdleConns: dbConfig.MaxIdleConns,
  47. ConnMaxLifetime: dbConfig.ConnMaxLifetime,
  48. }
  49. // 创建数据库连接
  50. db, err := dbDriver.Open(driverConfig)
  51. if err != nil {
  52. return nil, fmt.Errorf("failed to open database connection: %v", err)
  53. }
  54. return db, nil
  55. }
  56. // GetConfig 获取配置信息
  57. func (f *DBFactory) GetConfig() config.IConfig {
  58. return f.config
  59. }
  60. // GetAvailableDrivers 获取可用的数据库驱动
  61. func (f *DBFactory) GetAvailableDrivers() []string {
  62. return drivers.GetAllDrivers()
  63. }
  64. // CreateQueryExecutor 创建查询执行器
  65. // func (f *DBFactory) CreateQueryExecutor(db *sql.DB) *QueryExecutor {
  66. // return newQueryExecutor(db)
  67. // }
  68. // -------------- 对外暴露的初始化方法(核心入口)--------------
  69. // NewDBQuery 初始化查询实例(对外提供唯一初始化入口)
  70. // db: 已初始化的数据库连接(由调用方传入,解耦数据库配置)
  71. func newDBQuery(db *sql.DB) *queryExecutor {
  72. return newQueryExecutor(db)
  73. }
  74. // QuickQueryToJSON 快捷查询,直接返回 JSON 字节流
  75. func QueryToJSON(db *sql.DB, sql string) *types.QueryResult {
  76. return newDBQuery(db).queryToJSON(sql)
  77. }
  78. // QuickQueryToCSV 快捷查询,直接返回 CSV 字符串(包含表头)
  79. func QueryToCSV(db *sql.DB, sql string) ([]byte, error) {
  80. return newDBQuery(db).queryToCSV(sql)
  81. }
  82. // QuickExecuteWithColumns 快捷查询,返回完整结果(含列信息)
  83. func QueryWithColumns(db *sql.DB, sql string) *types.QueryResult {
  84. return newDBQuery(db).queryWithColumns(sql)
  85. }
  86. // QuickExecuteDataOnly 快捷查询,返回纯数据(性能优先)
  87. func QueryDataOnly(db *sql.DB, sql string) *types.QueryResult {
  88. return newDBQuery(db).queryDataOnly(sql)
  89. }
  90. // QuickExecuteCSV 快捷查询,返回 CSV 格式结果(支持自定义是否包含表头)
  91. func QueryCSV(db *sql.DB, sql string, includeHeader bool) *types.QueryResult {
  92. return newDBQuery(db).queryCSV(sql, includeHeader)
  93. }
  94. // QuickExecuteCSVStream 快捷流式输出 CSV(直接写入 io.Writer,适合大文件)
  95. func QueryCSVStream(db *sql.DB, sql string, w io.Writer, includeHeader bool) (int, error) {
  96. return newDBQuery(db).queryCSVStream(sql, w, includeHeader)
  97. }
  98. // QuickExecuteDDL 快捷执行DDL语句
  99. func ExecuteDDL(db *sql.DB, ddlSQL string) error {
  100. factory := &DBFactory{}
  101. return factory.executeDDL(db, ddlSQL)
  102. }
  103. // QuickExecuteDDLWithTx 快捷在事务中执行DDL语句
  104. func ExecuteDDLWithTx(db *sql.DB, ddlSQL string) error {
  105. factory := &DBFactory{}
  106. return factory.executeDDLWithTx(db, ddlSQL)
  107. }
  108. // QuickExecuteMultipleDDL 快捷执行多个DDL语句
  109. func ExecuteMultipleDDL(db *sql.DB, ddlSQLs []string) error {
  110. factory := &DBFactory{}
  111. return factory.executeMultipleDDL(db, ddlSQLs)
  112. }
  113. // testConnection 测试数据库连接
  114. func TestConnection(db *sql.DB, dbType string) error {
  115. var query string
  116. switch dbType {
  117. case "mysql", "postgres", "sqlserver":
  118. query = "SELECT 1"
  119. case "oracle":
  120. query = "SELECT 1 FROM DUAL"
  121. default:
  122. query = "SELECT 1"
  123. }
  124. var result int
  125. err := db.QueryRow(query).Scan(&result)
  126. if err != nil {
  127. return err
  128. }
  129. if result != 1 {
  130. return fmt.Errorf("unexpected test result: %d", result)
  131. }
  132. return nil
  133. }