Bladeren bron

测试通过

qdy 3 maanden geleden
bovenliggende
commit
508b17ee9f
4 gewijzigde bestanden met toevoegingen van 152 en 18 verwijderingen
  1. 115
    0
      factory/execute.go
  2. 35
    17
      factory/factory.go
  3. 1
    1
      factory/query.go
  4. 1
    0
      go.mod

+ 115
- 0
factory/execute.go Bestand weergeven

@@ -0,0 +1,115 @@
1
+package factory
2
+
3
+import (
4
+	"database/sql"
5
+	"fmt"
6
+)
7
+
8
+// ExecuteDDL 执行DDL语句(创建、删除、更新表等)
9
+func (f *DBFactory) ExecuteDDL(db *sql.DB, ddlSQL string) error {
10
+	if db == nil {
11
+		return fmt.Errorf("database connection is nil")
12
+	}
13
+
14
+	if ddlSQL == "" {
15
+		return fmt.Errorf("DDL SQL statement is empty")
16
+	}
17
+
18
+	// 执行DDL语句
19
+	_, err := db.Exec(ddlSQL)
20
+	if err != nil {
21
+		return fmt.Errorf("failed to execute DDL: %v", err)
22
+	}
23
+
24
+	return nil
25
+}
26
+
27
+// ExecuteDDLWithTx 在事务中执行DDL语句
28
+func (f *DBFactory) ExecuteDDLWithTx(db *sql.DB, ddlSQL string) error {
29
+	if db == nil {
30
+		return fmt.Errorf("database connection is nil")
31
+	}
32
+
33
+	if ddlSQL == "" {
34
+		return fmt.Errorf("DDL SQL statement is empty")
35
+	}
36
+
37
+	// 开始事务
38
+	tx, err := db.Begin()
39
+	if err != nil {
40
+		return fmt.Errorf("failed to begin transaction: %v", err)
41
+	}
42
+
43
+	// 执行DDL语句
44
+	_, err = tx.Exec(ddlSQL)
45
+	if err != nil {
46
+		// 回滚事务
47
+		tx.Rollback()
48
+		return fmt.Errorf("failed to execute DDL in transaction: %v", err)
49
+	}
50
+
51
+	// 提交事务
52
+	if err := tx.Commit(); err != nil {
53
+		return fmt.Errorf("failed to commit transaction: %v", err)
54
+	}
55
+
56
+	return nil
57
+}
58
+
59
+// ExecuteMultipleDDL 执行多个DDL语句
60
+func (f *DBFactory) ExecuteMultipleDDL(db *sql.DB, ddlSQLs []string) error {
61
+	if db == nil {
62
+		return fmt.Errorf("database connection is nil")
63
+	}
64
+
65
+	if len(ddlSQLs) == 0 {
66
+		return fmt.Errorf("DDL SQL statements are empty")
67
+	}
68
+
69
+	// 开始事务
70
+	tx, err := db.Begin()
71
+	if err != nil {
72
+		return fmt.Errorf("failed to begin transaction: %v", err)
73
+	}
74
+
75
+	// 依次执行所有DDL语句
76
+	for i, ddlSQL := range ddlSQLs {
77
+		if ddlSQL == "" {
78
+			tx.Rollback()
79
+			return fmt.Errorf("DDL SQL statement at index %d is empty", i)
80
+		}
81
+
82
+		_, err = tx.Exec(ddlSQL)
83
+		if err != nil {
84
+			tx.Rollback()
85
+			return fmt.Errorf("failed to execute DDL at index %d: %v", i, err)
86
+		}
87
+	}
88
+
89
+	// 提交事务
90
+	if err := tx.Commit(); err != nil {
91
+		return fmt.Errorf("failed to commit transaction: %v", err)
92
+	}
93
+
94
+	return nil
95
+}
96
+
97
+// 快捷方法 - 对外暴露的DDL执行方法
98
+
99
+// QuickExecuteDDL 快捷执行DDL语句
100
+func QuickExecuteDDL(db *sql.DB, ddlSQL string) error {
101
+	factory := &DBFactory{}
102
+	return factory.ExecuteDDL(db, ddlSQL)
103
+}
104
+
105
+// QuickExecuteDDLWithTx 快捷在事务中执行DDL语句
106
+func QuickExecuteDDLWithTx(db *sql.DB, ddlSQL string) error {
107
+	factory := &DBFactory{}
108
+	return factory.ExecuteDDLWithTx(db, ddlSQL)
109
+}
110
+
111
+// QuickExecuteMultipleDDL 快捷执行多个DDL语句
112
+func QuickExecuteMultipleDDL(db *sql.DB, ddlSQLs []string) error {
113
+	factory := &DBFactory{}
114
+	return factory.ExecuteMultipleDDL(db, ddlSQLs)
115
+}

+ 35
- 17
factory/factory.go Bestand weergeven

@@ -77,43 +77,61 @@ func (f *DBFactory) GetAvailableDrivers() []string {
77 77
 }
78 78
 
79 79
 // CreateQueryExecutor 创建查询执行器
80
-func (f *DBFactory) CreateQueryExecutor(db *sql.DB) *QueryExecutor {
81
-	return NewQueryExecutor(db)
82
-}
80
+// func (f *DBFactory) CreateQueryExecutor(db *sql.DB) *QueryExecutor {
81
+// 	return newQueryExecutor(db)
82
+// }
83 83
 
84 84
 // -------------- 对外暴露的初始化方法(核心入口)--------------
85 85
 // NewDBQuery 初始化查询实例(对外提供唯一初始化入口)
86 86
 // db: 已初始化的数据库连接(由调用方传入,解耦数据库配置)
87
-func NewDBQuery(db *sql.DB) *QueryExecutor {
88
-	return NewQueryExecutor(db)
87
+func newDBQuery(db *sql.DB) *QueryExecutor {
88
+	return newQueryExecutor(db)
89 89
 }
90 90
 
91 91
 // QuickQueryToJSON 快捷查询,直接返回 JSON 字节流
92
-func QuickQueryToJSON(db *sql.DB, sql string) *types.QueryResult {
93
-	return NewDBQuery(db).QueryToJSON(sql)
92
+func QueryToJSON(db *sql.DB, sql string) *types.QueryResult {
93
+	return newDBQuery(db).QueryToJSON(sql)
94 94
 }
95 95
 
96 96
 // QuickQueryToCSV 快捷查询,直接返回 CSV 字符串(包含表头)
97
-func QuickQueryToCSV(db *sql.DB, sql string) ([]byte, error) {
98
-	return NewDBQuery(db).QueryToCSV(sql)
97
+func QueryToCSV(db *sql.DB, sql string) ([]byte, error) {
98
+	return newDBQuery(db).QueryToCSV(sql)
99 99
 }
100 100
 
101 101
 // QuickExecuteWithColumns 快捷查询,返回完整结果(含列信息)
102
-func QuickExecuteWithColumns(db *sql.DB, sql string) *types.QueryResult {
103
-	return NewDBQuery(db).ExecuteQueryWithColumns(sql)
102
+func QueryWithColumns(db *sql.DB, sql string) *types.QueryResult {
103
+	return newDBQuery(db).ExecuteQueryWithColumns(sql)
104 104
 }
105 105
 
106 106
 // QuickExecuteDataOnly 快捷查询,返回纯数据(性能优先)
107
-func QuickExecuteDataOnly(db *sql.DB, sql string) *types.QueryResult {
108
-	return NewDBQuery(db).ExecuteQueryDataOnly(sql)
107
+func QueryDataOnly(db *sql.DB, sql string) *types.QueryResult {
108
+	return newDBQuery(db).ExecuteQueryDataOnly(sql)
109 109
 }
110 110
 
111 111
 // QuickExecuteCSV 快捷查询,返回 CSV 格式结果(支持自定义是否包含表头)
112
-func QuickExecuteCSV(db *sql.DB, sql string, includeHeader bool) *types.QueryResult {
113
-	return NewDBQuery(db).ExecuteQueryCSV(sql, includeHeader)
112
+func QueryCSV(db *sql.DB, sql string, includeHeader bool) *types.QueryResult {
113
+	return newDBQuery(db).ExecuteQueryCSV(sql, includeHeader)
114 114
 }
115 115
 
116 116
 // QuickExecuteCSVStream 快捷流式输出 CSV(直接写入 io.Writer,适合大文件)
117
-func QuickExecuteCSVStream(db *sql.DB, sql string, w io.Writer, includeHeader bool) (int, error) {
118
-	return NewDBQuery(db).ExecuteQueryCSVStream(sql, w, includeHeader)
117
+func QueryCSVStream(db *sql.DB, sql string, w io.Writer, includeHeader bool) (int, error) {
118
+	return newDBQuery(db).ExecuteQueryCSVStream(sql, w, includeHeader)
119
+}
120
+
121
+// QuickExecuteDDL 快捷执行DDL语句
122
+func ExecuteDDL(db *sql.DB, ddlSQL string) error {
123
+	factory := &DBFactory{}
124
+	return factory.ExecuteDDL(db, ddlSQL)
125
+}
126
+
127
+// QuickExecuteDDLWithTx 快捷在事务中执行DDL语句
128
+func ExecuteDDLWithTx(db *sql.DB, ddlSQL string) error {
129
+	factory := &DBFactory{}
130
+	return factory.ExecuteDDLWithTx(db, ddlSQL)
131
+}
132
+
133
+// QuickExecuteMultipleDDL 快捷执行多个DDL语句
134
+func ExecuteMultipleDDL(db *sql.DB, ddlSQLs []string) error {
135
+	factory := &DBFactory{}
136
+	return factory.ExecuteMultipleDDL(db, ddlSQLs)
119 137
 }

+ 1
- 1
factory/query.go Bestand weergeven

@@ -22,7 +22,7 @@ type QueryExecutor struct {
22 22
 }
23 23
 
24 24
 // NewQueryExecutor 创建查询执行器
25
-func NewQueryExecutor(db *sql.DB) *QueryExecutor {
25
+func newQueryExecutor(db *sql.DB) *QueryExecutor {
26 26
 	return &QueryExecutor{db: db}
27 27
 }
28 28
 

+ 1
- 0
go.mod Bestand weergeven

@@ -1,3 +1,4 @@
1
+// v0.1.12
1 2
 module git.x2erp.com/qdy/go-db
2 3
 
3 4
 go 1.25.4

Laden…
Annuleren
Opslaan