Няма описание
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.

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