Explorar el Código

修改工厂,实现单例模式

qdy hace 3 meses
padre
commit
d55f4b8fa5
Se han modificado 8 ficheros con 62 adiciones y 93 borrados
  1. 4
    4
      functions/heath.go
  2. 7
    6
      functions/info.go
  3. 16
    0
      functions/query.go
  4. 5
    5
      functions/query_csv.go
  5. 2
    1
      go.mod
  6. 6
    0
      go.sum
  7. 22
    59
      main.go
  8. 0
    18
      routes/query.go

routes/heath.go → functions/heath.go Ver fichero

@@ -1,7 +1,6 @@
1
-package routes
1
+package functions
2 2
 
3 3
 import (
4
-	"database/sql"
5 4
 	"time"
6 5
 
7 6
 	"github.com/gin-gonic/gin"
@@ -11,10 +10,11 @@ import (
11 10
 )
12 11
 
13 12
 // HealthHandler 返回一个处理函数
14
-func HealthHandler(db *sql.DB, dbType string) gin.HandlerFunc {
13
+func HealthHandler(dbFactory *factory.DBFactory, dbType string) gin.HandlerFunc {
15 14
 	return func(c *gin.Context) {
16 15
 
17
-		err := factory.TestConnection(db, dbType)
16
+		dbFactory.TestConnection(dbType)
17
+		err := dbFactory.TestConnection(dbType)
18 18
 		success := err == nil
19 19
 
20 20
 		status := "DOWN"

routes/info.go → functions/info.go Ver fichero

@@ -1,10 +1,11 @@
1
-package routes
1
+package functions
2 2
 
3 3
 import (
4 4
 	"time"
5 5
 
6 6
 	"github.com/gin-gonic/gin"
7 7
 
8
+	"git.x2erp.com/qdy/go-base/config"
8 9
 	"git.x2erp.com/qdy/go-base/types"
9 10
 	"git.x2erp.com/qdy/go-db/factory"
10 11
 )
@@ -12,16 +13,16 @@ import (
12 13
 // InfoHandler 数据库信息
13 14
 func InfoHandler(dbFactory *factory.DBFactory) gin.HandlerFunc {
14 15
 	return func(c *gin.Context) {
15
-		config := dbFactory.GetConfig()
16
+		dbConfig := config.GetConfig()
16 17
 		drivers := dbFactory.GetAvailableDrivers()
17 18
 
18 19
 		c.JSON(200, &types.QueryResult{
19 20
 			Success: true,
20 21
 			Data: map[string]interface{}{
21
-				"database_type":     config.GetDatabase().Type,
22
-				"database_host":     config.GetDatabase().Host,
23
-				"database_port":     config.GetDatabase().Port,
24
-				"database_name":     config.GetDatabase().Database,
22
+				"database_type":     dbConfig.GetDatabase().Type,
23
+				"database_host":     dbConfig.GetDatabase().Host,
24
+				"database_port":     dbConfig.GetDatabase().Port,
25
+				"database_name":     dbConfig.GetDatabase().Database,
25 26
 				"available_drivers": drivers,
26 27
 				"service_time":      time.Now().Format(time.RFC3339),
27 28
 			},

+ 16
- 0
functions/query.go Ver fichero

@@ -0,0 +1,16 @@
1
+package functions
2
+
3
+import (
4
+	"github.com/gin-gonic/gin"
5
+
6
+	"git.x2erp.com/qdy/go-base/types"
7
+	"git.x2erp.com/qdy/go-db/factory"
8
+)
9
+
10
+// 执行查询,返回JSON格式数据
11
+func QueryToJSON(dbFactory *factory.DBFactory) func(c *gin.Context, req types.QueryRequest) {
12
+	return func(c *gin.Context, req types.QueryRequest) {
13
+		result := dbFactory.QueryToJSON(req.SQL)
14
+		c.JSON(200, result)
15
+	}
16
+}

routes/query_csv.go → functions/query_csv.go Ver fichero

@@ -1,8 +1,6 @@
1
-package routes
1
+package functions
2 2
 
3 3
 import (
4
-	"database/sql"
5
-
6 4
 	"github.com/gin-gonic/gin"
7 5
 
8 6
 	"git.x2erp.com/qdy/go-base/mycsv"
@@ -11,9 +9,11 @@ import (
11 9
 )
12 10
 
13 11
 // 创建带 db 的 handler
14
-func QueryHandlerCSV(db *sql.DB) func(c *gin.Context, req types.QueryRequest) {
12
+func QueryToCSV(dbFactory *factory.DBFactory) func(c *gin.Context, req types.QueryRequest) {
15 13
 	return func(c *gin.Context, req types.QueryRequest) {
16
-		csvData, err := factory.QueryToCSV(db, req.SQL)
14
+
15
+		csvData, err := dbFactory.QueryToCSV(req.SQL)
16
+
17 17
 		if err != nil {
18 18
 			// 错误时也返回CSV格式,而不是JSON
19 19
 			errorCSV := mycsv.CreateStringToCSV(err.Error())

+ 2
- 1
go.mod Ver fichero

@@ -4,7 +4,7 @@ go 1.25.4
4 4
 
5 5
 require (
6 6
 	git.x2erp.com/qdy/go-base v0.1.10
7
-	git.x2erp.com/qdy/go-db v0.1.15
7
+	git.x2erp.com/qdy/go-db v0.1.16
8 8
 	github.com/gin-gonic/gin v1.11.0
9 9
 )
10 10
 
@@ -27,6 +27,7 @@ require (
27 27
 	github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
28 28
 	github.com/golang-sql/sqlexp v0.1.0 // indirect
29 29
 	github.com/google/uuid v1.6.0 // indirect
30
+	github.com/jmoiron/sqlx v1.4.0 // indirect
30 31
 	github.com/json-iterator/go v1.1.12 // indirect
31 32
 	github.com/klauspost/cpuid/v2 v2.3.0 // indirect
32 33
 	github.com/leodido/go-urn v1.4.0 // indirect

+ 6
- 0
go.sum Ver fichero

@@ -12,6 +12,8 @@ git.x2erp.com/qdy/go-db v0.1.13 h1:gx1Ld+b3QRaO7VvyBm4fipafGkl0Yl+4ERzromAtck4=
12 12
 git.x2erp.com/qdy/go-db v0.1.13/go.mod h1:tcHV7sqEFYWbL/196NZxVnbdHevefRppggMTARVXQtE=
13 13
 git.x2erp.com/qdy/go-db v0.1.15 h1:YvwT/FyrvQQodzggGLyxlSQu++f7+NHDvkUR7tuDVfY=
14 14
 git.x2erp.com/qdy/go-db v0.1.15/go.mod h1:5dnPmDEOhfuKtV1anuSibSNibTINul6/qdRxH1khQ8k=
15
+git.x2erp.com/qdy/go-db v0.1.16 h1:un5FMemqX6jSDdp6N2+7Elw73iC9zUH5r8UlX+JZfak=
16
+git.x2erp.com/qdy/go-db v0.1.16/go.mod h1:OrWk/iWygMEWsB7Rzdu7VjPszyEog8bodLx+X+5nWxE=
15 17
 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 h1:Gt0j3wceWMwPmiazCa8MzMA0MfhmPIz0Qp0FJ6qcM0U=
16 18
 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0/go.mod h1:Ot/6aikWnKWi4l9QB7qVSwa8iMphQNqkWALMoNT3rzM=
17 19
 github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1 h1:B+blDbyVIG3WaikNxPnhPiJ1MThR03b3vKGtER95TP4=
@@ -53,6 +55,7 @@ github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHO
53 55
 github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo=
54 56
 github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
55 57
 github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
58
+github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
56 59
 github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=
57 60
 github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
58 61
 github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
@@ -70,6 +73,8 @@ github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX
70 73
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
71 74
 github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
72 75
 github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
76
+github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o=
77
+github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY=
73 78
 github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
74 79
 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
75 80
 github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
@@ -82,6 +87,7 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
82 87
 github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
83 88
 github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
84 89
 github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
90
+github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
85 91
 github.com/microsoft/go-mssqldb v1.9.4 h1:sHrj3GcdgkxytZ09aZ3+ys72pMeyEXJowT44j74pNgs=
86 92
 github.com/microsoft/go-mssqldb v1.9.4/go.mod h1:GBbW9ASTiDC+mpgWDGKdm3FnFLTUsLYN3iFL90lQ+PA=
87 93
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=

+ 22
- 59
main.go Ver fichero

@@ -1,75 +1,33 @@
1 1
 package main
2 2
 
3 3
 import (
4
-	"database/sql"
5 4
 	"fmt"
6 5
 	"log"
7 6
 	"net/http"
8 7
 	"strings"
9 8
 	"time"
10 9
 
10
+	"git.x2erp.com/qdy/go-base/config"
11 11
 	"git.x2erp.com/qdy/go-base/types"
12 12
 	"git.x2erp.com/qdy/go-db/factory"
13 13
 	"git.x2erp.com/qdy/go-service-agent/auth"
14
-	"git.x2erp.com/qdy/go-service-agent/routes"
14
+	"git.x2erp.com/qdy/go-service-agent/functions"
15 15
 	"github.com/gin-gonic/gin"
16 16
 )
17 17
 
18
-// 单例实例
19
-var (
20
-	dbFactory *factory.DBFactory
21
-	db        *sql.DB
22
-)
23
-
24
-// initDB 初始化数据库连接(单例)
25
-func initDB() error {
26
-	var err error
27
-
28
-	// 创建数据库工厂(单例)
29
-	if dbFactory == nil {
30
-		dbFactory, err = factory.NewDBFactory()
31
-		if err != nil {
32
-			return fmt.Errorf("failed to create DB factory: %v", err)
33
-		}
34
-	}
35
-
36
-	// 创建数据库连接(单例)
37
-	if db == nil {
38
-		db, err = dbFactory.CreateDB()
39
-		if err != nil {
40
-			return fmt.Errorf("failed to create database connection: %v", err)
41
-		}
42
-	}
43
-
44
-	// 测试连接
45
-	config := dbFactory.GetConfig()
46
-	if err := factory.TestConnection(db, config.GetDatabase().Type); err != nil {
47
-		return fmt.Errorf("database connection test failed: %v", err)
48
-	}
49
-
50
-	return nil
51
-}
52
-
53 18
 func main() {
54
-	// 1. 初始化数据库(单例)
55
-	if err := initDB(); err != nil {
56
-		log.Fatalf("Database initialization failed: %v", err)
57
-	}
58 19
 
59
-	// 2. 显示基础信息
60
-	drivers := dbFactory.GetAvailableDrivers()
61
-	config := dbFactory.GetConfig()
20
+	cfg := config.GetConfig()
62 21
 
63
-	log.Printf("Service Port: %d", config.GetService().Port)
64
-	log.Printf("Service IdleTimeout: %d", config.GetService().IdleTimeout)
65
-	log.Printf("Service ReadTimeout: %d", config.GetService().ReadTimeout)
66
-	log.Printf("Service WriteTimeout: %d", config.GetService().WriteTimeout)
67
-	log.Printf("Service TrustedProxies: %s", config.GetService().TrustedProxies)
22
+	log.Printf("Service Port: %d", cfg.GetService().Port)
23
+	log.Printf("Service IdleTimeout: %d", cfg.GetService().IdleTimeout)
24
+	log.Printf("Service ReadTimeout: %d", cfg.GetService().ReadTimeout)
25
+	log.Printf("Service WriteTimeout: %d", cfg.GetService().WriteTimeout)
26
+	log.Printf("Service TrustedProxies: %s", cfg.GetService().TrustedProxies)
68 27
 
69
-	log.Printf("Available database drivers: %v", drivers)
70
-	log.Printf("Using database type: %s", config.GetDatabase().Type)
71
-	log.Printf("Database host: %s:%d", config.GetDatabase().Host, config.GetDatabase().Port)
72
-	log.Printf("Database name: %s", config.GetDatabase().Database)
28
+	log.Printf("Using database type: %s", cfg.GetDatabase().Type)
29
+	log.Printf("Database host: %s:%d", cfg.GetDatabase().Host, cfg.GetDatabase().Port)
30
+	log.Printf("Database name: %s", cfg.GetDatabase().Database)
73 31
 	log.Println("Database connection test passed!")
74 32
 
75 33
 	// 3. 启动Gin HTTP服务
@@ -80,14 +38,19 @@ func main() {
80 38
 func startHTTPServer() {
81 39
 	//建立路由
82 40
 	router := gin.Default()
83
-	config := dbFactory.GetConfig()
84
-	serviceConfig := config.GetService()
41
+	cfg := config.GetConfig()
42
+	serviceConfig := cfg.GetService()
43
+
44
+	dbFactory, err := factory.GetDBFactory()
45
+	if err != nil {
46
+		log.Fatalf("Failed to create DB factory: %v", err)
47
+	}
85 48
 
86 49
 	// 核心路由
87
-	router.GET("/api/health", routes.HealthHandler(db, config.GetDatabase().Type))
88
-	router.POST("/api/query", auth.AuthMiddleware(), withQueryRequest(routes.QueryHandler(db)))
89
-	router.POST("/api/query/csv", auth.AuthMiddleware(), withQueryRequest(routes.QueryHandlerCSV(db)))
90
-	router.GET("/api/info", routes.InfoHandler(dbFactory))
50
+	router.GET("/api/health", functions.HealthHandler(dbFactory, cfg.GetDatabase().Type))
51
+	router.POST("/api/query", auth.AuthMiddleware(), withQueryRequest(functions.QueryToJSON(dbFactory)))
52
+	router.POST("/api/query/csv", auth.AuthMiddleware(), withQueryRequest(functions.QueryToCSV(dbFactory)))
53
+	router.GET("/api/info", functions.InfoHandler(dbFactory))
91 54
 
92 55
 	// 日志输出配置信息
93 56
 	log.Printf("Service Port: %d", serviceConfig.Port)

+ 0
- 18
routes/query.go Ver fichero

@@ -1,18 +0,0 @@
1
-package routes
2
-
3
-import (
4
-	"database/sql"
5
-
6
-	"github.com/gin-gonic/gin"
7
-
8
-	"git.x2erp.com/qdy/go-base/types"
9
-	"git.x2erp.com/qdy/go-db/factory"
10
-)
11
-
12
-// 创建带 db 的 handler
13
-func QueryHandler(db *sql.DB) func(c *gin.Context, req types.QueryRequest) {
14
-	return func(c *gin.Context, req types.QueryRequest) {
15
-		result := factory.QueryToJSON(db, req.SQL)
16
-		c.JSON(200, result)
17
-	}
18
-}

Loading…
Cancelar
Guardar