Sin descripción
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

query_json.go 4.1KB

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