数据库 – 如何使用反射调用Golang中的扫描变量函数?

前端之家收集整理的这篇文章主要介绍了数据库 – 如何使用反射调用Golang中的扫描变量函数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在寻找使用反射来调用 Rows.Scan()功能。然而,它需要一个可变数量的指针,但我是新来的戈兰,没有很多源代码示例。我需要使用反思,因为我打算使用Query调用的值填充一个切片。所以基本上使用rows.Columns()获取行的长度,然后make()一个[] interface {}的片段填充通常使用传递给Scan()函数的指针来填充的数据点。

基本上这样的代码

  1. col := rows.Columns()
  2. vals := make([]interface{},len(cols))
  3. rows.Scan(&vals)

任何人都有一个例子,调用一个可以使用反射的指针的可变函数,我可以看一下?

编辑:
示例代码似乎没有做我以后的事情。

  1. package main
  2.  
  3. import (
  4. _ "github.com/lib/pq"
  5. "database/sql"
  6. "fmt"
  7. )
  8.  
  9.  
  10. func main() {
  11.  
  12. db,_ := sql.Open(
  13. "postgres","user=postgres dbname=Go_Testing password=ssap sslmode=disable")
  14.  
  15. rows,_ := db.Query("SELECT * FROM _users;")
  16.  
  17. cols,_ := rows.Columns()
  18.  
  19. for rows.Next() {
  20.  
  21. data := make([]interface{},len(cols))
  22.  
  23. rows.Scan(data...)
  24.  
  25. fmt.Println(data)
  26. }
  27.  
  28. }

结果:

  1. [<nil> <nil> <nil> <nil> <nil>]
  2. [<nil> <nil> <nil> <nil> <nil>]
  3. [<nil> <nil> <nil> <nil> <nil>]
  4. [<nil> <nil> <nil> <nil> <nil>]
  5. [<nil> <nil> <nil> <nil> <nil>]
  6. [<nil> <nil> <nil> <nil> <nil>]

解决方法

这是我到达的解决方案。它在遍历数据之前没有得到类型,所以在通过Scan()方法拉出值之前,手头不知道每个值的类型,但是实际上并不需要先了解类型。

诀窍是创建2个片段,一个用于值,一个保存与值片段并行的指针。然后一旦指针用于填充数据,则值数组实际上用数据填充,然后可以用它来填充其他数据结构。

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. _ "github.com/lib/pq"
  6. "database/sql"
  7. )
  8.  
  9. func main() {
  10.  
  11. db,"user=postgres dbname=go_testing password=pass sslmode=disable")
  12.  
  13. rows,_ := db.Query("SELECT * FROM _user;")
  14.  
  15. columns,_ := rows.Columns()
  16. count := len(columns)
  17. values := make([]interface{},count)
  18. valuePtrs := make([]interface{},count)
  19.  
  20. for rows.Next() {
  21.  
  22. for i,_ := range columns {
  23. valuePtrs[i] = &values[i]
  24. }
  25.  
  26. rows.Scan(valuePtrs...)
  27.  
  28. for i,col := range columns {
  29.  
  30. var v interface{}
  31.  
  32. val := values[i]
  33.  
  34. b,ok := val.([]byte)
  35.  
  36. if (ok) {
  37. v = string(b)
  38. } else {
  39. v = val
  40. }
  41.  
  42. fmt.Println(col,v)
  43. }
  44. }
  45. }

猜你在找的MsSQL相关文章