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.

query_json.go 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package function
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "time"
  6. "git.x2erp.com/qdy/go-base/ctx"
  7. "git.x2erp.com/qdy/go-base/model/response"
  8. "github.com/jmoiron/sqlx"
  9. )
  10. // QueryParamsNameToJSON 执行带命名参数的查询
  11. func QueryParamsNameToJSON(db *sqlx.DB, sql string, params map[string]interface{}, reqCtx *ctx.RequestContext) *response.QueryResult[[]map[string]interface{}] {
  12. startTime := time.Now()
  13. if sql == "" {
  14. return createErrorResult("SQL query cannot be empty", startTime, reqCtx)
  15. }
  16. // 处理命名参数
  17. query, args, err := sqlx.Named(sql, params)
  18. if err != nil {
  19. return createErrorResult(fmt.Sprintf("Failed to process named parameters: %v", err), startTime, reqCtx)
  20. }
  21. // 执行查询
  22. rows, err := db.Query(sqlx.Rebind(sqlx.DOLLAR, query), args...)
  23. //rows, err := sqlx.NamedQuery(db, sql, params)
  24. if err != nil {
  25. return createErrorResult(fmt.Sprintf("Query execution failed: %v", err), startTime, reqCtx)
  26. }
  27. defer rows.Close()
  28. // 处理结果集
  29. return processQueryResult(rows, startTime)
  30. }
  31. // QueryPositionalToJSON 执行带位置参数的查询
  32. func QueryPositionalToJSON(db *sqlx.DB, sql string, params []interface{}, reqCtx *ctx.RequestContext) *response.QueryResult[[]map[string]interface{}] {
  33. startTime := time.Now()
  34. //fmt.Printf("positionalParams: %s", params)
  35. //fmt.Printf("sql: %s", sql)
  36. if sql == "" {
  37. return createErrorResult("SQL query cannot be empty", startTime, reqCtx)
  38. }
  39. // 执行查询
  40. rows, err := db.Query(sql, params...)
  41. if err != nil {
  42. return createErrorResult(fmt.Sprintf("Query execution failed: %v", err), startTime, reqCtx)
  43. }
  44. defer rows.Close()
  45. // 处理结果集
  46. return processQueryResult(rows, startTime)
  47. }
  48. // QueryToJSON 执行无参数的查询
  49. func QueryToJSON(db *sqlx.DB, sql string, reqCtx *ctx.RequestContext) *response.QueryResult[[]map[string]interface{}] {
  50. startTime := time.Now()
  51. if sql == "" {
  52. return createErrorResult("SQL query cannot be empty", startTime, reqCtx)
  53. }
  54. // 执行查询
  55. rows, err := db.Query(sql)
  56. if err != nil {
  57. return createErrorResult(fmt.Sprintf("Query execution failed: %v", err), startTime, reqCtx)
  58. }
  59. defer rows.Close()
  60. // 处理结果集
  61. return processQueryResult(rows, startTime)
  62. }
  63. // processQueryResult 处理查询结果(公共部分)
  64. func processQueryResult(rows *sql.Rows, startTime time.Time) *response.QueryResult[[]map[string]interface{}] {
  65. result := &response.QueryResult[[]map[string]interface{}]{}
  66. // 获取列信息
  67. columns, err := rows.Columns()
  68. if err != nil {
  69. result.Success = false
  70. result.Error = fmt.Sprintf("Failed to get columns: %v", err)
  71. result.Time = time.Since(startTime).String()
  72. return result
  73. }
  74. var results []map[string]interface{}
  75. count := 0
  76. // 遍历所有行
  77. for rows.Next() {
  78. count++
  79. values := make([]interface{}, len(columns))
  80. valuePtrs := make([]interface{}, len(columns))
  81. for i := range columns {
  82. valuePtrs[i] = &values[i]
  83. }
  84. if err := rows.Scan(valuePtrs...); err != nil {
  85. result.Success = false
  86. result.Error = fmt.Sprintf("Failed to scan row: %v", err)
  87. result.Time = time.Since(startTime).String()
  88. return result
  89. }
  90. resultMap := make(map[string]interface{})
  91. for i, col := range columns {
  92. // 完全不处理类型,直接赋值,让 json.Marshal 自己处理
  93. resultMap[col] = values[i]
  94. }
  95. results = append(results, resultMap)
  96. }
  97. // 检查行遍历错误
  98. if err := rows.Err(); err != nil {
  99. result.Success = false
  100. result.Error = fmt.Sprintf("Row iteration error: %v", err)
  101. result.Time = time.Since(startTime).String()
  102. return result
  103. }
  104. // 构建成功结果
  105. result.Success = true
  106. result.Data = results
  107. result.Count = count
  108. result.Time = time.Since(startTime).String()
  109. return result
  110. }
  111. // createErrorResult 创建错误结果的辅助函数
  112. func createErrorResult(errorMsg string, startTime time.Time, reqCtx *ctx.RequestContext) *response.QueryResult[[]map[string]interface{}] {
  113. return &response.QueryResult[[]map[string]interface{}]{
  114. Success: false,
  115. Error: errorMsg,
  116. Time: time.Since(startTime).String(),
  117. Metadata: reqCtx,
  118. }
  119. }