Açıklama Yok
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 3.9KB

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