go-sql-driver包是一个第三方包 下载地址http://github.com/go-sql-driver/mysql 下面直接上代码

  1. package main
  2. import (
  3. "database/sql"
  4. "fmt"
  5. _ "github.com/go-sql-driver/mysql"
  6. )
  7. func main() {
  8. //连接数据库
  9. db, err := sql.Open("mysql", "root:@tcp(localhost:3306)/go?charset=utf8")
  10. if err != nil {
  11. fmt.Println("连接数据库失败", err.Error())
  12. return
  13. }
  14. defer db.Close()
  15. //查询数据库
  16. query, err := db.Query("select * from go_user")
  17. if err != nil {
  18. fmt.Println("查询数据库失败", err.Error())
  19. return
  20. }
  21. defer query.Close()
  22. //读出查询出的列字段名
  23. cols, _ := query.Columns()
  24. //values是每个列的值,这里获取到byte里
  25. values := make([][]byte, len(cols))
  26. //query.Scan的参数,因为每次查询出来的列是不定长的,用len(cols)定住当次查询的长度
  27. scans := make([]interface{}, len(cols))
  28. //让每一行数据都填充到[][]byte里面
  29. for i := range values {
  30. scans[i] = &values[i]
  31. }
  32. //最后得到的map
  33. results := make(map[int]map[string]string) //当然也可以用鸭子类型 results := make(map[int]interface{})
  34. i := 0
  35. for query.Next() { //循环,让游标往下推
  36. if err := query.Scan(scans...); err != nil { //query.Scan查询出来的不定长值放到scans[i] = &values[i],也就是每行都放在values里
  37. fmt.Println(err)
  38. return
  39. }
  40. row := make(map[string]string) //每行数据
  41. for k, v := range values { //每行数据是放在values里面,现在把它挪到row里
  42. key := cols[k]
  43. row[key] = string(v)
  44. }
  45. results[i] = row //装入结果集中
  46. i++
  47. }
  48. //查询出来的数组
  49. for k, v := range results {
  50. fmt.Println(k, v)
  51. }
  52. db.Close() //用完关闭
  53. }

参考: https://my.oschina.net/tongjh/blog/333050

分类: web

标签:   golang