Brak opisu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

factory.go 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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 QuickQueryToJSON(db *sql.DB, sql string) *types.QueryResult {
  76. return NewDBQuery(db).QueryToJSON(sql)
  77. }
  78. // QuickQueryToCSV 快捷查询,直接返回 CSV 字符串(包含表头)
  79. func QuickQueryToCSV(db *sql.DB, sql string) *types.QueryResult {
  80. return NewDBQuery(db).QueryToCSV(sql)
  81. }
  82. // QuickExecuteWithColumns 快捷查询,返回完整结果(含列信息)
  83. func QuickExecuteWithColumns(db *sql.DB, sql string) *types.QueryResult {
  84. return NewDBQuery(db).ExecuteQueryWithColumns(sql)
  85. }
  86. // QuickExecuteDataOnly 快捷查询,返回纯数据(性能优先)
  87. func QuickExecuteDataOnly(db *sql.DB, sql string) *types.QueryResult {
  88. return NewDBQuery(db).ExecuteQueryDataOnly(sql)
  89. }
  90. // QuickExecuteCSV 快捷查询,返回 CSV 格式结果(支持自定义是否包含表头)
  91. func QuickExecuteCSV(db *sql.DB, sql string, includeHeader bool) *types.QueryResult {
  92. return NewDBQuery(db).ExecuteQueryCSV(sql, includeHeader)
  93. }
  94. // QuickExecuteCSVStream 快捷流式输出 CSV(直接写入 io.Writer,适合大文件)
  95. func QuickExecuteCSVStream(db *sql.DB, sql string, w io.Writer, includeHeader bool) (int, error) {
  96. return NewDBQuery(db).ExecuteQueryCSVStream(sql, w, includeHeader)
  97. }