Нет описания
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

query_json.go 3.8KB

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