package db import ( "MeterService/core/utils" "database/sql" "sync" ) var ( err error myDbs *map[string]*MyDB ) const defaultDb = "default" var once sync.Once type MyDB struct { DB *sql.DB } // OpenDb 获取数据库连接 func OpenDb(dbFun func() *sql.DB) { once.Do(func() { myDbs = &map[string]*MyDB{} }) myDb := NewDB(dbFun()) (*myDbs)[defaultDb] = myDb } func GetDb() *MyDB { return (*myDbs)[defaultDb] } func CloseDb() { err := (*myDbs)[defaultDb].DB.Close() if err != nil { return } else { panic(err) } } func OpenManyDb(key string, dbFun func() *sql.DB) { once.Do(func() { myDbs = &map[string]*MyDB{} }) myDb := NewDB(dbFun()) (*myDbs)[key] = myDb } func GetDbByKey(key string) *MyDB { return (*myDbs)[key] } func CloseManyDb() { for _, v := range *myDbs { err := v.DB.Close() if err != nil { return } else { panic(err) } } } // Exec 增、删、改 func (db *MyDB) Exec(SQL string, args ...interface{}) (sql.Result, error) { //DB := OpenDb().DB() var ret sql.Result if args == nil { ret, err = db.DB.Exec(SQL) } else { ret, err = db.DB.Exec(SQL, args...) } if err != nil { return nil, err } return ret, nil } // Query 查询 func (db *MyDB) Query(SQL string, args ...interface{}) ([]map[string]string, bool) { //通用查询 var rows *sql.Rows if args == nil { rows, err = db.DB.Query(SQL) } else { rows, err = db.DB.Query(SQL, args...) } //rows, err := DB.Query(SQL, args) //执行SQL语句,比如select * from users if err != nil { panic(err) } columns, _ := rows.Columns() //获取列的信息 count := len(columns) //列的数量 var values = make([]interface{}, count) //创建一个与列的数量相当的空接口 for i, _ := range values { var ii interface{} //为空接口分配内存 values[i] = &ii //取得这些内存的指针,因后继的Scan函数只接受指针 } ret := make([]map[string]string, 0) //创建返回值:不定长的map类型切片 for rows.Next() { err := rows.Scan(values...) //开始读行,Scan函数只接受指针变量 m := make(map[string]string) //用于存放1列的 [键/值] 对 if err != nil { panic(err) } for i, colName := range columns { var rawValue = *(values[i].(*interface{})) //读出raw数据 b, ok := rawValue.([]byte) var v string if ok { v = string(b) //将raw数据转换成字符串 } else { v, err = utils.ToString(rawValue) //colName是键,v是值 if err != nil { panic(err) } } m[colName] = v } ret = append(ret, m) //将单行所有列的键值对附加在总的返回值上(以行为单位) } defer func(rows *sql.Rows) { _ = rows.Close() }(rows) if len(ret) != 0 { return ret, true } return nil, false } func NewDB(db *sql.DB) *MyDB { return &MyDB{DB: db} }