No Description
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.

mysql_test.go 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package main
  2. import (
  3. "encoding/json"
  4. "log"
  5. "testing"
  6. "git.x2erp.com/qdy/go-base/config"
  7. "git.x2erp.com/qdy/go-db/factory/database"
  8. )
  9. func TestNamedParamsQuery(t *testing.T) {
  10. cfg := config.GetConfig()
  11. factory := database.CreateDBFactory(cfg)
  12. defer factory.Close()
  13. // 简化的SQL,只测试3个参数
  14. sql := `
  15. SELECT * FROM (
  16. SELECT a.*, ROWNUM rn FROM (
  17. SELECT CLOTHING_ID, CLOTHING_NAME
  18. FROM X6_STOCK_DEV.A3_CLOTHING
  19. ORDER BY CLOTHING_ID
  20. ) a WHERE ROWNUM <= :1
  21. ) WHERE rn > :2
  22. `
  23. // // 3个参数
  24. params := []interface{}{
  25. 10,
  26. 0,
  27. }
  28. db := factory.GetDB()
  29. rows, err := db.Query(sql, params...) // 获取行结果集
  30. if err != nil {
  31. log.Fatalf("查询失败: %v", err)
  32. }
  33. defer rows.Close()
  34. // 1. 获取列信息
  35. columns, err := rows.Columns()
  36. if err != nil {
  37. log.Fatalf("获取列失败: %v", err)
  38. }
  39. // 2. 准备存储结果的切片
  40. var results []map[string]interface{}
  41. // 3. 遍历每一行
  42. for rows.Next() {
  43. // 创建值的切片(每个列一个值)
  44. values := make([]interface{}, len(columns))
  45. valuePtrs := make([]interface{}, len(columns))
  46. for i := range values {
  47. valuePtrs[i] = &values[i]
  48. }
  49. // 扫描行数据
  50. err := rows.Scan(valuePtrs...)
  51. if err != nil {
  52. log.Fatalf("扫描行失败: %v", err)
  53. }
  54. // 将当前行转换为 map
  55. rowMap := make(map[string]interface{})
  56. for i, col := range columns {
  57. val := values[i]
  58. // 处理特殊类型(如 []byte 转换为 string)
  59. if b, ok := val.([]byte); ok {
  60. rowMap[col] = string(b)
  61. } else {
  62. rowMap[col] = val
  63. }
  64. }
  65. results = append(results, rowMap)
  66. }
  67. // 检查遍历过程中的错误
  68. if err = rows.Err(); err != nil {
  69. log.Fatalf("遍历行错误: %v", err)
  70. }
  71. // 4. 现在可以序列化为 JSON
  72. reqJSON1, err := json.MarshalIndent(results, "", " ")
  73. if err != nil {
  74. log.Fatalf("JSON序列化失败: %v", err)
  75. }
  76. log.Printf("查询结果:\n%s", string(reqJSON1))
  77. log.Printf("共 %d 行数据", len(results))
  78. }