Aucune description
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

factory.go 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package factory
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "io"
  6. "os"
  7. "path/filepath"
  8. "git.x2erp.com/qdy/go-base/types"
  9. "git.x2erp.com/qdy/go-db/drivers"
  10. "gopkg.in/yaml.v2"
  11. )
  12. // Config 总配置
  13. type Config struct {
  14. Database drivers.DBConfig `yaml:"database"`
  15. }
  16. // DBFactory 数据库工厂
  17. type DBFactory struct {
  18. config *Config
  19. }
  20. // NewDBFactory 创建数据库工厂
  21. func NewDBFactory() (*DBFactory, error) {
  22. configFile, err := findConfigFile()
  23. if err != nil {
  24. return nil, err
  25. }
  26. fmt.Printf("✅ Using config file: %s\n", configFile)
  27. // 读取配置文件
  28. data, err := os.ReadFile(configFile)
  29. if err != nil {
  30. return nil, fmt.Errorf("failed to read config file %s: %v", configFile, err)
  31. }
  32. var config Config
  33. err = yaml.Unmarshal(data, &config)
  34. if err != nil {
  35. return nil, fmt.Errorf("failed to parse config file: %v", err)
  36. }
  37. return &DBFactory{config: &config}, nil
  38. }
  39. // findConfigFile 查找配置文件
  40. func findConfigFile() (string, error) {
  41. // 1. 首先尝试可执行文件同目录
  42. exePath, err := os.Executable()
  43. if err == nil {
  44. exeDir := filepath.Dir(exePath)
  45. configFile := filepath.Join(exeDir, "db.yaml")
  46. if _, err := os.Stat(configFile); err == nil {
  47. return configFile, nil
  48. }
  49. }
  50. // 2. 尝试环境变量指定的路径
  51. envConfigPath := os.Getenv("DB_CONFIG_PATH")
  52. if envConfigPath != "" {
  53. if _, err := os.Stat(envConfigPath); err == nil {
  54. return envConfigPath, nil
  55. }
  56. return "", fmt.Errorf("DB_CONFIG_PATH file not found: %s", envConfigPath)
  57. }
  58. // 3. 如果都没有找到,返回错误
  59. exeDir := "unknown"
  60. if exePath, err := os.Executable(); err == nil {
  61. exeDir = filepath.Dir(exePath)
  62. }
  63. return "", fmt.Errorf(`No configuration file found!
  64. Tried locations:
  65. 1. Executable directory: %s/db.yaml
  66. 2. Environment variable: DB_CONFIG_PATH
  67. Solutions:
  68. - Place db.yaml in the same directory as the executable
  69. - Or set DB_CONFIG_PATH environment variable to config file path
  70. Example:
  71. export DB_CONFIG_PATH=/path/to/your/db.yaml`, exeDir)
  72. }
  73. // CreateDB 创建数据库连接
  74. func (f *DBFactory) CreateDB() (*sql.DB, error) {
  75. dbType := f.config.Database.Type
  76. // 获取对应的驱动
  77. dbDriver, err := drivers.Get(dbType)
  78. if err != nil {
  79. return nil, fmt.Errorf("failed to get database driver: %v", err)
  80. }
  81. // 创建数据库连接
  82. db, err := dbDriver.Open(f.config.Database)
  83. if err != nil {
  84. return nil, fmt.Errorf("failed to open database connection: %v", err)
  85. }
  86. return db, nil
  87. }
  88. // GetConfig 获取配置信息
  89. func (f *DBFactory) GetConfig() *Config {
  90. return f.config
  91. }
  92. // GetAvailableDrivers 获取可用的数据库驱动
  93. func (f *DBFactory) GetAvailableDrivers() []string {
  94. return drivers.GetAllDrivers()
  95. }
  96. // CreateQueryExecutor 创建查询执行器(新增方法)
  97. func (f *DBFactory) CreateQueryExecutor(db *sql.DB) *QueryExecutor {
  98. return NewQueryExecutor(db)
  99. }
  100. // -------------- 对外暴露的初始化方法(核心入口)--------------
  101. // NewDBQuery 初始化查询实例(对外提供唯一初始化入口)
  102. // db: 已初始化的数据库连接(由调用方传入,解耦数据库配置)
  103. func NewDBQuery(db *sql.DB) *QueryExecutor {
  104. // 直接复用原文件的构造函数,对外隐藏实现细节
  105. return NewQueryExecutor(db)
  106. }
  107. // QuickQueryToJSON 快捷查询,直接返回 JSON 字节流
  108. func QuickQueryToJSON(db *sql.DB, sql string) *types.QueryResult {
  109. return NewDBQuery(db).QueryToJSON(sql)
  110. }
  111. // QuickQueryToCSV 快捷查询,直接返回 CSV 字符串(包含表头)
  112. func QuickQueryToCSV(db *sql.DB, sql string) *types.QueryResult {
  113. return NewDBQuery(db).QueryToCSV(sql)
  114. }
  115. // QuickExecuteWithColumns 快捷查询,返回完整结果(含列信息)
  116. func QuickExecuteWithColumns(db *sql.DB, sql string) *types.QueryResult {
  117. return NewDBQuery(db).ExecuteQueryWithColumns(sql)
  118. }
  119. // QuickExecuteDataOnly 快捷查询,返回纯数据(性能优先)
  120. func QuickExecuteDataOnly(db *sql.DB, sql string) *types.QueryResult {
  121. return NewDBQuery(db).ExecuteQueryDataOnly(sql)
  122. }
  123. // QuickExecuteCSV 快捷查询,返回 CSV 格式结果(支持自定义是否包含表头)
  124. func QuickExecuteCSV(db *sql.DB, sql string, includeHeader bool) *types.QueryResult {
  125. return NewDBQuery(db).ExecuteQueryCSV(sql, includeHeader)
  126. }
  127. // QuickExecuteCSVStream 快捷流式输出 CSV(直接写入 io.Writer,适合大文件)
  128. func QuickExecuteCSVStream(db *sql.DB, sql string, w io.Writer, includeHeader bool) (int, error) {
  129. return NewDBQuery(db).ExecuteQueryCSVStream(sql, w, includeHeader)
  130. }