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

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