db.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package db
  2. import (
  3. "MeterService/core/utils"
  4. "database/sql"
  5. "sync"
  6. )
  7. var (
  8. err error
  9. myDb *MyDB
  10. )
  11. var once sync.Once
  12. type MyDB struct {
  13. DB *sql.DB
  14. }
  15. // OpenDb 获取数据库连接
  16. func OpenDb(dbFun func() *sql.DB) {
  17. once.Do(func() {
  18. myDb = &MyDB{DB: dbFun()}
  19. })
  20. }
  21. func GetDb() *MyDB {
  22. return myDb
  23. }
  24. func CloseDb() {
  25. err := myDb.DB.Close()
  26. if err != nil {
  27. return
  28. } else {
  29. panic(err)
  30. }
  31. }
  32. // Exec 增、删、改
  33. func (db *MyDB) Exec(SQL string, args ...interface{}) (sql.Result, error) {
  34. //DB := OpenDb().DB()
  35. var ret sql.Result
  36. if args == nil {
  37. ret, err = db.DB.Exec(SQL)
  38. } else {
  39. ret, err = db.DB.Exec(SQL, args...)
  40. }
  41. if err != nil {
  42. return nil, err
  43. }
  44. return ret, nil
  45. }
  46. // Query 查询
  47. func (db *MyDB) Query(SQL string, args ...interface{}) ([]map[string]string, bool) { //通用查询
  48. var rows *sql.Rows
  49. if args == nil {
  50. rows, err = db.DB.Query(SQL)
  51. } else {
  52. rows, err = db.DB.Query(SQL, args...)
  53. }
  54. //rows, err := DB.Query(SQL, args) //执行SQL语句,比如select * from users
  55. if err != nil {
  56. panic(err)
  57. }
  58. columns, _ := rows.Columns() //获取列的信息
  59. count := len(columns) //列的数量
  60. var values = make([]interface{}, count) //创建一个与列的数量相当的空接口
  61. for i, _ := range values {
  62. var ii interface{} //为空接口分配内存
  63. values[i] = &ii //取得这些内存的指针,因后继的Scan函数只接受指针
  64. }
  65. ret := make([]map[string]string, 0) //创建返回值:不定长的map类型切片
  66. for rows.Next() {
  67. err := rows.Scan(values...) //开始读行,Scan函数只接受指针变量
  68. m := make(map[string]string) //用于存放1列的 [键/值] 对
  69. if err != nil {
  70. panic(err)
  71. }
  72. for i, colName := range columns {
  73. var rawValue = *(values[i].(*interface{})) //读出raw数据,类型为byte
  74. //b, _ := rawValue.([]byte)
  75. //v := string(b) //将raw数据转换成字符串
  76. m[colName], err = utils.ToString(rawValue) //colName是键,v是值
  77. if err != nil {
  78. panic(err)
  79. }
  80. }
  81. ret = append(ret, m) //将单行所有列的键值对附加在总的返回值上(以行为单位)
  82. }
  83. defer func(rows *sql.Rows) {
  84. _ = rows.Close()
  85. }(rows)
  86. if len(ret) != 0 {
  87. return ret, true
  88. }
  89. return nil, false
  90. }
  91. func NewDB(db *sql.DB) *MyDB {
  92. return &MyDB{DB: db}
  93. }