qdy 3 miesięcy temu
rodzic
commit
eeef81a3a5

+ 2
- 2
functions/heath.go Wyświetl plik

6
 	"github.com/gin-gonic/gin"
6
 	"github.com/gin-gonic/gin"
7
 
7
 
8
 	"git.x2erp.com/qdy/go-base/types"
8
 	"git.x2erp.com/qdy/go-base/types"
9
-	"git.x2erp.com/qdy/go-db/factory"
9
+	"git.x2erp.com/qdy/go-db/factory/database"
10
 )
10
 )
11
 
11
 
12
 // HealthHandler 返回一个处理函数
12
 // HealthHandler 返回一个处理函数
13
-func HealthHandler(dbFactory *factory.DBFactory, dbType string) gin.HandlerFunc {
13
+func HealthHandler(dbFactory *database.DBFactory, dbType string) gin.HandlerFunc {
14
 	return func(c *gin.Context) {
14
 	return func(c *gin.Context) {
15
 
15
 
16
 		dbFactory.TestConnection(dbType)
16
 		dbFactory.TestConnection(dbType)

+ 2
- 2
functions/info.go Wyświetl plik

7
 
7
 
8
 	"git.x2erp.com/qdy/go-base/config"
8
 	"git.x2erp.com/qdy/go-base/config"
9
 	"git.x2erp.com/qdy/go-base/types"
9
 	"git.x2erp.com/qdy/go-base/types"
10
-	"git.x2erp.com/qdy/go-db/factory"
10
+	"git.x2erp.com/qdy/go-db/factory/database"
11
 )
11
 )
12
 
12
 
13
 // InfoHandler 数据库信息
13
 // InfoHandler 数据库信息
14
-func InfoHandler(dbFactory *factory.DBFactory) gin.HandlerFunc {
14
+func InfoHandler(dbFactory *database.DBFactory) gin.HandlerFunc {
15
 	return func(c *gin.Context) {
15
 	return func(c *gin.Context) {
16
 		dbConfig := config.GetConfig()
16
 		dbConfig := config.GetConfig()
17
 		drivers := dbFactory.GetAvailableDrivers()
17
 		drivers := dbFactory.GetAvailableDrivers()

+ 4
- 4
functions/query_csv.go Wyświetl plik

5
 
5
 
6
 	"git.x2erp.com/qdy/go-base/mycsv"
6
 	"git.x2erp.com/qdy/go-base/mycsv"
7
 	"git.x2erp.com/qdy/go-base/types"
7
 	"git.x2erp.com/qdy/go-base/types"
8
-	"git.x2erp.com/qdy/go-db/factory"
8
+	"git.x2erp.com/qdy/go-db/factory/database"
9
 )
9
 )
10
 
10
 
11
 // 统一的错误响应处理
11
 // 统一的错误响应处理
23
 }
23
 }
24
 
24
 
25
 // 执行查询,返回CSV数据格式。无参数查询
25
 // 执行查询,返回CSV数据格式。无参数查询
26
-func QueryToCSV(dbFactory *factory.DBFactory) func(c *gin.Context, req types.QueryRequest) {
26
+func QueryToCSV(dbFactory *database.DBFactory) func(c *gin.Context, req types.QueryRequest) {
27
 	return func(c *gin.Context, req types.QueryRequest) {
27
 	return func(c *gin.Context, req types.QueryRequest) {
28
 		csvData, err := dbFactory.QueryToCSV(req.SQL, req.WriterHeader)
28
 		csvData, err := dbFactory.QueryToCSV(req.SQL, req.WriterHeader)
29
 		if err != nil {
29
 		if err != nil {
35
 }
35
 }
36
 
36
 
37
 // 执行查询,返回CSV数据格式。带参数名称进行查询
37
 // 执行查询,返回CSV数据格式。带参数名称进行查询
38
-func QueryParamNameToCSV(dbFactory *factory.DBFactory) func(c *gin.Context, req types.QueryRequest) {
38
+func QueryParamNameToCSV(dbFactory *database.DBFactory) func(c *gin.Context, req types.QueryRequest) {
39
 	return func(c *gin.Context, req types.QueryRequest) {
39
 	return func(c *gin.Context, req types.QueryRequest) {
40
 
40
 
41
 		csvData, err := dbFactory.QueryParamsNameToCSV(req.SQL, req.WriterHeader, req.Params)
41
 		csvData, err := dbFactory.QueryParamsNameToCSV(req.SQL, req.WriterHeader, req.Params)
48
 }
48
 }
49
 
49
 
50
 // 执行查询,返回CSV数据格式。带占位参数进行查询
50
 // 执行查询,返回CSV数据格式。带占位参数进行查询
51
-func QueryPositionalToCSV(dbFactory *factory.DBFactory) func(c *gin.Context, req types.QueryRequest) {
51
+func QueryPositionalToCSV(dbFactory *database.DBFactory) func(c *gin.Context, req types.QueryRequest) {
52
 	return func(c *gin.Context, req types.QueryRequest) {
52
 	return func(c *gin.Context, req types.QueryRequest) {
53
 		csvData, err := dbFactory.QueryPositionalToCSV(req.SQL, req.WriterHeader, req.PositionalParams)
53
 		csvData, err := dbFactory.QueryPositionalToCSV(req.SQL, req.WriterHeader, req.PositionalParams)
54
 		if err != nil {
54
 		if err != nil {

+ 4
- 4
functions/query_json.go Wyświetl plik

4
 	"github.com/gin-gonic/gin"
4
 	"github.com/gin-gonic/gin"
5
 
5
 
6
 	"git.x2erp.com/qdy/go-base/types"
6
 	"git.x2erp.com/qdy/go-base/types"
7
-	"git.x2erp.com/qdy/go-db/factory"
7
+	"git.x2erp.com/qdy/go-db/factory/database"
8
 )
8
 )
9
 
9
 
10
 // 执行查询,返回CSV数据格式。无参数查询
10
 // 执行查询,返回CSV数据格式。无参数查询
11
-func QueryToJSON(dbFactory *factory.DBFactory) func(c *gin.Context, req types.QueryRequest) {
11
+func QueryToJSON(dbFactory *database.DBFactory) func(c *gin.Context, req types.QueryRequest) {
12
 	return func(c *gin.Context, req types.QueryRequest) {
12
 	return func(c *gin.Context, req types.QueryRequest) {
13
 		result := dbFactory.QueryToJSON(req.SQL)
13
 		result := dbFactory.QueryToJSON(req.SQL)
14
 		c.JSON(200, result)
14
 		c.JSON(200, result)
16
 }
16
 }
17
 
17
 
18
 // 执行查询,返回CSV数据格式。带参数名称进行查询
18
 // 执行查询,返回CSV数据格式。带参数名称进行查询
19
-func QueryParamNameToJSON(dbFactory *factory.DBFactory) func(c *gin.Context, req types.QueryRequest) {
19
+func QueryParamNameToJSON(dbFactory *database.DBFactory) func(c *gin.Context, req types.QueryRequest) {
20
 	return func(c *gin.Context, req types.QueryRequest) {
20
 	return func(c *gin.Context, req types.QueryRequest) {
21
 		result := dbFactory.QueryParamsNameToJSON(req.SQL, req.Params)
21
 		result := dbFactory.QueryParamsNameToJSON(req.SQL, req.Params)
22
 		c.JSON(200, result)
22
 		c.JSON(200, result)
24
 }
24
 }
25
 
25
 
26
 // 执行查询,返回JSON数据格式。带占位参数进行查询
26
 // 执行查询,返回JSON数据格式。带占位参数进行查询
27
-func QueryPositionalToJSON(dbFactory *factory.DBFactory) func(c *gin.Context, req types.QueryRequest) {
27
+func QueryPositionalToJSON(dbFactory *database.DBFactory) func(c *gin.Context, req types.QueryRequest) {
28
 	return func(c *gin.Context, req types.QueryRequest) {
28
 	return func(c *gin.Context, req types.QueryRequest) {
29
 		result := dbFactory.QueryPositionalToJSON(req.SQL, req.PositionalParams)
29
 		result := dbFactory.QueryPositionalToJSON(req.SQL, req.PositionalParams)
30
 
30
 

+ 3
- 3
main.go Wyświetl plik

12
 
12
 
13
 	"git.x2erp.com/qdy/go-base/config"
13
 	"git.x2erp.com/qdy/go-base/config"
14
 	"git.x2erp.com/qdy/go-base/types"
14
 	"git.x2erp.com/qdy/go-base/types"
15
-	"git.x2erp.com/qdy/go-db/factory"
15
+	"git.x2erp.com/qdy/go-db/factory/database"
16
 	"git.x2erp.com/qdy/go-service-agent/auth"
16
 	"git.x2erp.com/qdy/go-service-agent/auth"
17
 	"git.x2erp.com/qdy/go-service-agent/functions"
17
 	"git.x2erp.com/qdy/go-service-agent/functions"
18
 	"github.com/gin-gonic/gin"
18
 	"github.com/gin-gonic/gin"
44
 	cfg := config.GetConfig()
44
 	cfg := config.GetConfig()
45
 	serviceConfig := cfg.GetService()
45
 	serviceConfig := cfg.GetService()
46
 
46
 
47
-	dbFactory, err := factory.GetDBFactory()
47
+	dbFactory, err := database.GetDBFactory()
48
 	if err != nil {
48
 	if err != nil {
49
 		log.Fatalf("Failed to create DB factory: %v", err)
49
 		log.Fatalf("Failed to create DB factory: %v", err)
50
 	}
50
 	}
141
 
141
 
142
 }
142
 }
143
 
143
 
144
-func setupGracefulShutdown(dbFactory *factory.DBFactory) {
144
+func setupGracefulShutdown(dbFactory *database.DBFactory) {
145
 	signalCh := make(chan os.Signal, 1)
145
 	signalCh := make(chan os.Signal, 1)
146
 	signal.Notify(signalCh, os.Interrupt, syscall.SIGTERM)
146
 	signal.Notify(signalCh, os.Interrupt, syscall.SIGTERM)
147
 
147
 

+ 23
- 49
test/my0_test.go Wyświetl plik

3
 import (
3
 import (
4
 	"fmt"
4
 	"fmt"
5
 	"log"
5
 	"log"
6
-	"strings"
7
 	"sync"
6
 	"sync"
8
 	"testing"
7
 	"testing"
9
 	"time"
8
 	"time"
10
 
9
 
11
 	"git.x2erp.com/qdy/go-base/config"
10
 	"git.x2erp.com/qdy/go-base/config"
12
 	"git.x2erp.com/qdy/go-base/types"
11
 	"git.x2erp.com/qdy/go-base/types"
13
-	"git.x2erp.com/qdy/go-db/factory"
12
+	"git.x2erp.com/qdy/go-db/factory/doris"
13
+	"git.x2erp.com/qdy/go-db/factory/http"
14
 )
14
 )
15
 
15
 
16
 // // QueryRequest 查询请求结构体
16
 // // QueryRequest 查询请求结构体
30
 
30
 
31
 // 查询任务
31
 // 查询任务
32
 type QueryTask1 struct {
32
 type QueryTask1 struct {
33
-	Page           int
34
-	StartRow       int
35
-	EndRow         int
36
-	QuerySQL       string
37
-	QueryParams    []interface{}
38
-	CSVData        string
39
-	Error          error
40
-	QueryTime      time.Duration
41
-	SaveTime       time.Duration
42
-	LastClothingID string // 上一页最后一条记录的CLOTHING_ID
33
+	Page        int
34
+	StartRow    int
35
+	EndRow      int
36
+	QuerySQL    string
37
+	QueryParams []interface{}
38
+	CSVData     string
39
+	Error       error
40
+	QueryTime   time.Duration
41
+	SaveTime    time.Duration
43
 }
42
 }
44
 
43
 
45
 func TestQueryAndInsertToDoris1(t *testing.T) {
44
 func TestQueryAndInsertToDoris1(t *testing.T) {
57
 	fmt.Printf("开始执行分页查询,总共%d行,每页%d条,%d线程工作\n", pageConfig.TotalRows, pageConfig.PageSize, pageConfig.MaxWorkers)
56
 	fmt.Printf("开始执行分页查询,总共%d行,每页%d条,%d线程工作\n", pageConfig.TotalRows, pageConfig.PageSize, pageConfig.MaxWorkers)
58
 
57
 
59
 	// 1. 获取HTTP工厂实例
58
 	// 1. 获取HTTP工厂实例
60
-	httpFactory, err := factory.GetHTTPFactory()
59
+	httpFactory, err := http.GetHTTPFactory()
61
 	if err != nil {
60
 	if err != nil {
62
 		t.Fatalf("Failed to get HTTP factory: %v", err)
61
 		t.Fatalf("Failed to get HTTP factory: %v", err)
63
 	}
62
 	}
64
 	fmt.Println("HTTP factory created successfully")
63
 	fmt.Println("HTTP factory created successfully")
65
 
64
 
66
 	// 7. 获取Doris工厂实例
65
 	// 7. 获取Doris工厂实例
67
-	dorisFactory, err := factory.GetDorisFactory(httpFactory)
66
+	dorisFactory, err := doris.GetDorisFactory(httpFactory)
68
 	if err != nil {
67
 	if err != nil {
69
 		t.Fatalf("Failed to get Doris factory: %v", err)
68
 		t.Fatalf("Failed to get Doris factory: %v", err)
70
 	}
69
 	}
110
 
109
 
111
 			for task := range taskChan {
110
 			for task := range taskChan {
112
 				fmt.Printf("Worker %d 处理第 %d 页 (行 %d-%d, CLOTHING_ID > %s)...\n",
111
 				fmt.Printf("Worker %d 处理第 %d 页 (行 %d-%d, CLOTHING_ID > %s)...\n",
113
-					workerID, task.Page, task.StartRow, task.EndRow, task.LastClothingID)
112
+					workerID, task.Page, task.StartRow, task.EndRow)
114
 
113
 
115
 				// 记录查询开始时间
114
 				// 记录查询开始时间
116
 				queryStartTime := time.Now()
115
 				queryStartTime := time.Now()
196
 				completedTasks++
195
 				completedTasks++
197
 
196
 
198
 				fmt.Printf("✅ Worker 完成第 %d 页 (行 %d-%d, CLOTHING_ID > %s)\n",
197
 				fmt.Printf("✅ Worker 完成第 %d 页 (行 %d-%d, CLOTHING_ID > %s)\n",
199
-					task.Page, task.StartRow, task.EndRow, task.LastClothingID)
198
+					task.Page, task.StartRow, task.EndRow)
200
 				fmt.Printf("   查询耗时: %v, 保存耗时: %v\n", task.QueryTime, task.SaveTime)
199
 				fmt.Printf("   查询耗时: %v, 保存耗时: %v\n", task.QueryTime, task.SaveTime)
201
 				fmt.Printf("   估算数据行数: %d\n", estimatedRows)
200
 				fmt.Printf("   估算数据行数: %d\n", estimatedRows)
202
 
201
 
203
-				// 从CSV数据中提取最后一行的CLOTHING_ID
204
-				if task.CSVData != "" {
205
-					// 简单实现:取最后一行第一列的第一个记录
206
-					// 这里假设CSV格式是逗号分隔,没有标题行
207
-					lines := strings.Split(strings.TrimSpace(task.CSVData), "\n")
208
-					if len(lines) > 0 {
209
-						// 取最后一行(如果有多行数据)
210
-						lastLine := lines[len(lines)-1]
211
-						fields := strings.Split(lastLine, ",")
212
-						if len(fields) > 0 {
213
-							// 更新任务的LastClothingID
214
-							task.LastClothingID = strings.TrimSpace(fields[0]) // CLOTHING_ID是第一列
215
-							fmt.Printf("   提取到最后一个CLOTHING_ID: %s\n", task.LastClothingID)
216
-						}
217
-					}
218
-				}
219
 			}
202
 			}
220
 
203
 
221
 			mu.Unlock()
204
 			mu.Unlock()
231
 	// 生成任务并发送到任务通道
214
 	// 生成任务并发送到任务通道
232
 	fmt.Println("\n📋 开始生成查询任务...")
215
 	fmt.Println("\n📋 开始生成查询任务...")
233
 
216
 
234
-	// 初始CLOTHING_ID为"0"
235
-	lastClothingID := "A"
236
-
237
 	for page := 1; page <= totalPages; page++ {
217
 	for page := 1; page <= totalPages; page++ {
238
 		startRow := pageConfig.StartRow + (page-1)*pageConfig.PageSize + 1
218
 		startRow := pageConfig.StartRow + (page-1)*pageConfig.PageSize + 1
239
 		endRow := pageConfig.StartRow + page*pageConfig.PageSize
219
 		endRow := pageConfig.StartRow + page*pageConfig.PageSize
245
 		}
225
 		}
246
 
226
 
247
 		// 生成查询SQL(使用参数模式)
227
 		// 生成查询SQL(使用参数模式)
248
-		querySQL, queryParams := getSQLWithPagination(startRow, endRow, lastClothingID)
228
+		querySQL, queryParams := getSQLWithPagination(startRow, endRow)
249
 
229
 
250
 		task := QueryTask{
230
 		task := QueryTask{
251
-			Page:           page,
252
-			StartRow:       startRow,
253
-			EndRow:         endRow,
254
-			QuerySQL:       querySQL,
255
-			QueryParams:    queryParams,
256
-			LastClothingID: lastClothingID,
231
+			Page:        page,
232
+			StartRow:    startRow,
233
+			EndRow:      endRow,
234
+			QuerySQL:    querySQL,
235
+			QueryParams: queryParams,
257
 		}
236
 		}
258
 
237
 
259
-		fmt.Printf("生成第 %d 页任务 (行 %d-%d), 使用CLOTHING_ID > '%s'\n",
260
-			page, startRow, endRow, lastClothingID)
238
+		fmt.Printf("生成第 %d 页任务 (行 %d-%d), 使用CLOTHING_ID > '%s'\n", page, startRow, endRow)
261
 		taskChan <- task
239
 		taskChan <- task
262
 
240
 
263
-		// 注意:在实际场景中,lastClothingID需要在任务完成后更新
264
-		// 这里简化处理,每个任务使用相同的lastClothingID
265
-		// 更好的做法是使用任务队列和结果回调来更新lastClothingID
266
 	}
241
 	}
267
 
242
 
268
 	// 关闭任务通道,通知worker没有更多任务
243
 	// 关闭任务通道,通知worker没有更多任务
299
 
274
 
300
 // getSQLWithPagination 生成带分页的SQL语句(参数模式)
275
 // getSQLWithPagination 生成带分页的SQL语句(参数模式)
301
 // 返回SQL语句和参数映射
276
 // 返回SQL语句和参数映射
302
-func getSQLWithPagination1(startRow, endRow int, lastClothingID string) (string, []interface{}) {
277
+func getSQLWithPagination1(startRow, endRow int) (string, []interface{}) {
303
 	sql := `SELECT
278
 	sql := `SELECT
304
     CLOTHING_ID,
279
     CLOTHING_ID,
305
     CLOTHING_YEAR,
280
     CLOTHING_YEAR,
319
 
294
 
320
 	// 创建参数映射
295
 	// 创建参数映射
321
 	params := []interface{}{
296
 	params := []interface{}{
322
-		lastClothingID,
323
 		endRow,
297
 		endRow,
324
 		startRow - 1, // WHERE rn > :start_row 所以是startRow-1
298
 		startRow - 1, // WHERE rn > :start_row 所以是startRow-1
325
 	}
299
 	}

+ 24
- 48
test/my_ora_clothingToDoris_test.go Wyświetl plik

3
 import (
3
 import (
4
 	"fmt"
4
 	"fmt"
5
 	"log"
5
 	"log"
6
-	"strings"
7
 	"sync"
6
 	"sync"
8
 	"testing"
7
 	"testing"
9
 	"time"
8
 	"time"
10
 
9
 
11
 	"git.x2erp.com/qdy/go-base/config"
10
 	"git.x2erp.com/qdy/go-base/config"
12
 	"git.x2erp.com/qdy/go-base/types"
11
 	"git.x2erp.com/qdy/go-base/types"
13
-	"git.x2erp.com/qdy/go-db/factory"
12
+	"git.x2erp.com/qdy/go-db/factory/doris"
13
+	"git.x2erp.com/qdy/go-db/factory/http"
14
 )
14
 )
15
 
15
 
16
 // 一定要执行环境变量
16
 // 一定要执行环境变量
33
 
33
 
34
 // 查询任务
34
 // 查询任务
35
 type QueryTask struct {
35
 type QueryTask struct {
36
-	Page           int
37
-	StartRow       int
38
-	EndRow         int
39
-	QuerySQL       string
40
-	QueryParams    []interface{}
41
-	CSVData        string
42
-	Error          error
43
-	QueryTime      time.Duration
44
-	SaveTime       time.Duration
45
-	LastClothingID string // 上一页最后一条记录的CLOTHING_ID
36
+	Page        int
37
+	StartRow    int
38
+	EndRow      int
39
+	QuerySQL    string
40
+	QueryParams []interface{}
41
+	CSVData     string
42
+	Error       error
43
+	QueryTime   time.Duration
44
+	SaveTime    time.Duration
46
 }
45
 }
47
 
46
 
48
 func TestQueryAndInsertToDoris(t *testing.T) {
47
 func TestQueryAndInsertToDoris(t *testing.T) {
60
 	fmt.Printf("开始执行分页查询,总共%d行,每页%d条,%d线程工作\n", pageConfig.TotalRows, pageConfig.PageSize, pageConfig.MaxWorkers)
59
 	fmt.Printf("开始执行分页查询,总共%d行,每页%d条,%d线程工作\n", pageConfig.TotalRows, pageConfig.PageSize, pageConfig.MaxWorkers)
61
 
60
 
62
 	// 1. 获取HTTP工厂实例
61
 	// 1. 获取HTTP工厂实例
63
-	httpFactory, err := factory.GetHTTPFactory()
62
+	httpFactory, err := http.GetHTTPFactory()
64
 	if err != nil {
63
 	if err != nil {
65
 		t.Fatalf("Failed to get HTTP factory: %v", err)
64
 		t.Fatalf("Failed to get HTTP factory: %v", err)
66
 	}
65
 	}
67
 	fmt.Println("HTTP factory created successfully")
66
 	fmt.Println("HTTP factory created successfully")
68
 
67
 
69
 	// 7. 获取Doris工厂实例
68
 	// 7. 获取Doris工厂实例
70
-	dorisFactory, err := factory.GetDorisFactory(httpFactory)
69
+	dorisFactory, err := doris.GetDorisFactory(httpFactory)
71
 	if err != nil {
70
 	if err != nil {
72
 		t.Fatalf("Failed to get Doris factory: %v", err)
71
 		t.Fatalf("Failed to get Doris factory: %v", err)
73
 	}
72
 	}
113
 
112
 
114
 			for task := range taskChan {
113
 			for task := range taskChan {
115
 				fmt.Printf("Worker %d 处理第 %d 页 (行 %d-%d, CLOTHING_ID > %s)...\n",
114
 				fmt.Printf("Worker %d 处理第 %d 页 (行 %d-%d, CLOTHING_ID > %s)...\n",
116
-					workerID, task.Page, task.StartRow, task.EndRow, task.LastClothingID)
115
+					workerID, task.Page, task.StartRow, task.EndRow)
117
 
116
 
118
 				// 记录查询开始时间
117
 				// 记录查询开始时间
119
 				queryStartTime := time.Now()
118
 				queryStartTime := time.Now()
199
 				completedTasks++
198
 				completedTasks++
200
 
199
 
201
 				fmt.Printf("✅ Worker 完成第 %d 页 (行 %d-%d, CLOTHING_ID > %s)\n",
200
 				fmt.Printf("✅ Worker 完成第 %d 页 (行 %d-%d, CLOTHING_ID > %s)\n",
202
-					task.Page, task.StartRow, task.EndRow, task.LastClothingID)
201
+					task.Page, task.StartRow, task.EndRow)
203
 				fmt.Printf("   查询耗时: %v, 保存耗时: %v\n", task.QueryTime, task.SaveTime)
202
 				fmt.Printf("   查询耗时: %v, 保存耗时: %v\n", task.QueryTime, task.SaveTime)
204
 				fmt.Printf("   估算数据行数: %d\n", estimatedRows)
203
 				fmt.Printf("   估算数据行数: %d\n", estimatedRows)
205
 
204
 
206
-				// 从CSV数据中提取最后一行的CLOTHING_ID
207
-				if task.CSVData != "" {
208
-					// 简单实现:取最后一行第一列的第一个记录
209
-					// 这里假设CSV格式是逗号分隔,没有标题行
210
-					lines := strings.Split(strings.TrimSpace(task.CSVData), "\n")
211
-					if len(lines) > 0 {
212
-						// 取最后一行(如果有多行数据)
213
-						lastLine := lines[len(lines)-1]
214
-						fields := strings.Split(lastLine, ",")
215
-						if len(fields) > 0 {
216
-							// 更新任务的LastClothingID
217
-							task.LastClothingID = strings.TrimSpace(fields[0]) // CLOTHING_ID是第一列
218
-							fmt.Printf("   提取到最后一个CLOTHING_ID: %s\n", task.LastClothingID)
219
-						}
220
-					}
221
-				}
222
 			}
205
 			}
223
 
206
 
224
 			mu.Unlock()
207
 			mu.Unlock()
234
 	// 生成任务并发送到任务通道
217
 	// 生成任务并发送到任务通道
235
 	fmt.Println("\n📋 开始生成查询任务...")
218
 	fmt.Println("\n📋 开始生成查询任务...")
236
 
219
 
237
-	// 初始CLOTHING_ID为"0"
238
-	lastClothingID := "0"
239
-
240
 	for page := 1; page <= totalPages; page++ {
220
 	for page := 1; page <= totalPages; page++ {
241
 		startRow := pageConfig.StartRow + (page-1)*pageConfig.PageSize + 1
221
 		startRow := pageConfig.StartRow + (page-1)*pageConfig.PageSize + 1
242
 		endRow := pageConfig.StartRow + page*pageConfig.PageSize
222
 		endRow := pageConfig.StartRow + page*pageConfig.PageSize
248
 		}
228
 		}
249
 
229
 
250
 		// 生成查询SQL(使用参数模式)
230
 		// 生成查询SQL(使用参数模式)
251
-		querySQL, queryParams := getSQLWithPagination(startRow, endRow, lastClothingID)
231
+		querySQL, queryParams := getSQLWithPagination(startRow, endRow)
252
 
232
 
253
 		task := QueryTask{
233
 		task := QueryTask{
254
-			Page:           page,
255
-			StartRow:       startRow,
256
-			EndRow:         endRow,
257
-			QuerySQL:       querySQL,
258
-			QueryParams:    queryParams,
259
-			LastClothingID: lastClothingID,
234
+			Page:        page,
235
+			StartRow:    startRow,
236
+			EndRow:      endRow,
237
+			QuerySQL:    querySQL,
238
+			QueryParams: queryParams,
260
 		}
239
 		}
261
 
240
 
262
-		fmt.Printf("生成第 %d 页任务 (行 %d-%d), 使用CLOTHING_ID > '%s'\n",
263
-			page, startRow, endRow, lastClothingID)
241
+		fmt.Printf("生成第 %d 页任务 (行 %d-%d), 使用CLOTHING_ID > '%s'\n", page, startRow, endRow)
242
+
264
 		taskChan <- task
243
 		taskChan <- task
265
 
244
 
266
-		// 注意:在实际场景中,lastClothingID需要在任务完成后更新
267
-		// 这里简化处理,每个任务使用相同的lastClothingID
268
-		// 更好的做法是使用任务队列和结果回调来更新lastClothingID
269
 	}
245
 	}
270
 
246
 
271
 	// 关闭任务通道,通知worker没有更多任务
247
 	// 关闭任务通道,通知worker没有更多任务
302
 
278
 
303
 // getSQLWithPagination 生成带分页的SQL语句(参数模式)
279
 // getSQLWithPagination 生成带分页的SQL语句(参数模式)
304
 // 返回SQL语句和参数映射
280
 // 返回SQL语句和参数映射
305
-func getSQLWithPagination(startRow, endRow int, lastClothingID string) (string, []interface{}) {
281
+func getSQLWithPagination(startRow, endRow int) (string, []interface{}) {
306
 	sql := `SELECT
282
 	sql := `SELECT
307
     CLOTHING_ID,
283
     CLOTHING_ID,
308
     CLOTHING_YEAR,
284
     CLOTHING_YEAR,

+ 2
- 2
test/mycsv_test.go Wyświetl plik

5
 	"log"
5
 	"log"
6
 	"testing"
6
 	"testing"
7
 
7
 
8
-	"git.x2erp.com/qdy/go-db/factory"
8
+	"git.x2erp.com/qdy/go-db/factory/database"
9
 )
9
 )
10
 
10
 
11
 func TestNamedParamsQueryCSV(t *testing.T) {
11
 func TestNamedParamsQueryCSV(t *testing.T) {
12
-	factory, err := factory.GetDBFactory()
12
+	factory, err := database.GetDBFactory()
13
 	if err != nil {
13
 	if err != nil {
14
 		t.Fatalf("Failed to get DB factory: %v", err)
14
 		t.Fatalf("Failed to get DB factory: %v", err)
15
 	}
15
 	}

+ 2
- 2
test/mysql_test.go Wyświetl plik

5
 	"log"
5
 	"log"
6
 	"testing"
6
 	"testing"
7
 
7
 
8
-	"git.x2erp.com/qdy/go-db/factory"
8
+	"git.x2erp.com/qdy/go-db/factory/database"
9
 )
9
 )
10
 
10
 
11
 func TestNamedParamsQuery(t *testing.T) {
11
 func TestNamedParamsQuery(t *testing.T) {
12
-	factory, err := factory.GetDBFactory()
12
+	factory, err := database.GetDBFactory()
13
 	if err != nil {
13
 	if err != nil {
14
 		t.Fatalf("Failed to get DB factory: %v", err)
14
 		t.Fatalf("Failed to get DB factory: %v", err)
15
 	}
15
 	}

Ładowanie…
Anuluj
Zapisz