Procházet zdrojové kódy

修改工厂,实现单例模式

qdy před 3 měsíci
rodič
revize
d55f4b8fa5
8 změnil soubory, kde provedl 62 přidání a 93 odebrání
  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 Zobrazit soubor

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

routes/info.go → functions/info.go Zobrazit soubor

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

+ 16
- 0
functions/query.go Zobrazit soubor

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 Zobrazit soubor

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

+ 2
- 1
go.mod Zobrazit soubor

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

+ 6
- 0
go.sum Zobrazit soubor

12
 git.x2erp.com/qdy/go-db v0.1.13/go.mod h1:tcHV7sqEFYWbL/196NZxVnbdHevefRppggMTARVXQtE=
12
 git.x2erp.com/qdy/go-db v0.1.13/go.mod h1:tcHV7sqEFYWbL/196NZxVnbdHevefRppggMTARVXQtE=
13
 git.x2erp.com/qdy/go-db v0.1.15 h1:YvwT/FyrvQQodzggGLyxlSQu++f7+NHDvkUR7tuDVfY=
13
 git.x2erp.com/qdy/go-db v0.1.15 h1:YvwT/FyrvQQodzggGLyxlSQu++f7+NHDvkUR7tuDVfY=
14
 git.x2erp.com/qdy/go-db v0.1.15/go.mod h1:5dnPmDEOhfuKtV1anuSibSNibTINul6/qdRxH1khQ8k=
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
 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 h1:Gt0j3wceWMwPmiazCa8MzMA0MfhmPIz0Qp0FJ6qcM0U=
17
 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 h1:Gt0j3wceWMwPmiazCa8MzMA0MfhmPIz0Qp0FJ6qcM0U=
16
 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0/go.mod h1:Ot/6aikWnKWi4l9QB7qVSwa8iMphQNqkWALMoNT3rzM=
18
 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0/go.mod h1:Ot/6aikWnKWi4l9QB7qVSwa8iMphQNqkWALMoNT3rzM=
17
 github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1 h1:B+blDbyVIG3WaikNxPnhPiJ1MThR03b3vKGtER95TP4=
19
 github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1 h1:B+blDbyVIG3WaikNxPnhPiJ1MThR03b3vKGtER95TP4=
53
 github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo=
55
 github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo=
54
 github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
56
 github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
55
 github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
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
 github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=
59
 github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=
57
 github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
60
 github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
58
 github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
61
 github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
70
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
73
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
71
 github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
74
 github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
72
 github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
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
 github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
78
 github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
74
 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
79
 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
75
 github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
80
 github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
82
 github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
87
 github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
83
 github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
88
 github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
84
 github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
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
 github.com/microsoft/go-mssqldb v1.9.4 h1:sHrj3GcdgkxytZ09aZ3+ys72pMeyEXJowT44j74pNgs=
91
 github.com/microsoft/go-mssqldb v1.9.4 h1:sHrj3GcdgkxytZ09aZ3+ys72pMeyEXJowT44j74pNgs=
86
 github.com/microsoft/go-mssqldb v1.9.4/go.mod h1:GBbW9ASTiDC+mpgWDGKdm3FnFLTUsLYN3iFL90lQ+PA=
92
 github.com/microsoft/go-mssqldb v1.9.4/go.mod h1:GBbW9ASTiDC+mpgWDGKdm3FnFLTUsLYN3iFL90lQ+PA=
87
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
93
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=

+ 22
- 59
main.go Zobrazit soubor

1
 package main
1
 package main
2
 
2
 
3
 import (
3
 import (
4
-	"database/sql"
5
 	"fmt"
4
 	"fmt"
6
 	"log"
5
 	"log"
7
 	"net/http"
6
 	"net/http"
8
 	"strings"
7
 	"strings"
9
 	"time"
8
 	"time"
10
 
9
 
10
+	"git.x2erp.com/qdy/go-base/config"
11
 	"git.x2erp.com/qdy/go-base/types"
11
 	"git.x2erp.com/qdy/go-base/types"
12
 	"git.x2erp.com/qdy/go-db/factory"
12
 	"git.x2erp.com/qdy/go-db/factory"
13
 	"git.x2erp.com/qdy/go-service-agent/auth"
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
 	"github.com/gin-gonic/gin"
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
 func main() {
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
 	log.Println("Database connection test passed!")
31
 	log.Println("Database connection test passed!")
74
 
32
 
75
 	// 3. 启动Gin HTTP服务
33
 	// 3. 启动Gin HTTP服务
80
 func startHTTPServer() {
38
 func startHTTPServer() {
81
 	//建立路由
39
 	//建立路由
82
 	router := gin.Default()
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
 	log.Printf("Service Port: %d", serviceConfig.Port)
56
 	log.Printf("Service Port: %d", serviceConfig.Port)

+ 0
- 18
routes/query.go Zobrazit soubor

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…
Zrušit
Uložit