mysql.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package mysql
  2. import (
  3. "MeterService/core/config"
  4. "database/sql"
  5. "errors"
  6. "fmt"
  7. "sync"
  8. orm "github.com/jinzhu/gorm"
  9. _ "github.com/jinzhu/gorm/dialects/mysql"
  10. )
  11. type MySqlPool struct{}
  12. var once sync.Once
  13. var err error
  14. var db *orm.DB
  15. func GetDb() *orm.DB {
  16. once.Do(func() {
  17. db = openMySqlPool()
  18. })
  19. return db
  20. }
  21. func openMySqlPool() *orm.DB {
  22. dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
  23. config.C.Mysql.Username, config.C.Mysql.Password,
  24. config.C.Mysql.Host, config.C.Mysql.Port, config.C.Mysql.Name)
  25. db, err := orm.Open("mysql", dsn)
  26. if err != nil {
  27. panic(errors.New("mysql连接失败。" + err.Error()))
  28. }
  29. if config.C.Mysql.MaxIdleConns > 0 {
  30. db.DB().SetMaxIdleConns(config.C.Mysql.MaxIdleConns)
  31. }
  32. if config.C.Mysql.MaxOpenConns > 0 {
  33. db.DB().SetMaxOpenConns(config.C.Mysql.MaxOpenConns)
  34. }
  35. if config.C.Mysql.Log {
  36. db.LogMode(config.C.Mysql.Log)
  37. }
  38. return db
  39. }
  40. func CloseDb(db *orm.DB) {
  41. err := db.Close()
  42. if err != nil {
  43. return
  44. } else {
  45. panic(err)
  46. }
  47. }
  48. func (pool *MySqlPool) InitPool() (isSuc bool) {
  49. dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
  50. config.C.Mysql.Username, config.C.Mysql.Password,
  51. config.C.Mysql.Host, config.C.Mysql.Port, config.C.Mysql.Name)
  52. db, err := orm.Open("mysql", dsn)
  53. if err != nil {
  54. panic(err)
  55. return false
  56. }
  57. // 连接数配置也可以写入配置,在此读取
  58. if config.C.Mysql.MaxIdleConns > 0 {
  59. db.DB().SetMaxIdleConns(config.C.Mysql.MaxIdleConns)
  60. }
  61. if config.C.Mysql.MaxOpenConns > 0 {
  62. db.DB().SetMaxOpenConns(config.C.Mysql.MaxOpenConns)
  63. }
  64. return true
  65. }
  66. // Exec 增、删、改
  67. func Exec(SQL string, args ...interface{}) (sql.Result, error) {
  68. DB := GetDb().DB()
  69. ret, err := DB.Exec(SQL, args)
  70. if err != nil {
  71. return nil, err
  72. }
  73. return ret, nil
  74. }
  75. func Query(SQL string, args ...interface{}) ([]map[string]string, bool) { //通用查询
  76. DB := GetDb().DB()
  77. rows, err := DB.Query(SQL, args) //执行SQL语句,比如select * from users
  78. if err != nil {
  79. panic(err)
  80. }
  81. columns, _ := rows.Columns() //获取列的信息
  82. count := len(columns) //列的数量
  83. var values = make([]interface{}, count) //创建一个与列的数量相当的空接口
  84. for i, _ := range values {
  85. var ii interface{} //为空接口分配内存
  86. values[i] = &ii //取得这些内存的指针,因后继的Scan函数只接受指针
  87. }
  88. ret := make([]map[string]string, 0) //创建返回值:不定长的map类型切片
  89. for rows.Next() {
  90. err := rows.Scan(values...) //开始读行,Scan函数只接受指针变量
  91. m := make(map[string]string) //用于存放1列的 [键/值] 对
  92. if err != nil {
  93. panic(err)
  94. }
  95. for i, colName := range columns {
  96. var rawValue = *(values[i].(*interface{})) //读出raw数据,类型为byte
  97. b, _ := rawValue.([]byte)
  98. v := string(b) //将raw数据转换成字符串
  99. m[colName] = v //colName是键,v是值
  100. }
  101. ret = append(ret, m) //将单行所有列的键值对附加在总的返回值上(以行为单位)
  102. }
  103. defer func(rows *sql.Rows) {
  104. _ = rows.Close()
  105. }(rows)
  106. if len(ret) != 0 {
  107. return ret, true
  108. }
  109. return nil, false
  110. }