github.com/keysonZZZ/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgSql/Db.go (about)

     1  package kmgSql
     2  
     3  import (
     4  	"database/sql"
     5  	"sync"
     6  
     7  	_ "github.com/go-sql-driver/mysql"
     8  )
     9  
    10  //a wrap of database/sql.Db
    11  //表示一个数据库
    12  // 这个可以建立很多连接
    13  type DB struct {
    14  	DbQueryer
    15  	*sql.DB
    16  }
    17  
    18  func (q DB) Query(query string, args ...string) (output []map[string]string, err error) {
    19  	return q.DbQueryer.Query(query, args...)
    20  }
    21  
    22  func (q DB) Exec(query string, args ...string) (sql.Result, error) {
    23  	return q.DbQueryer.Exec(query, args...)
    24  }
    25  
    26  func NewDb(db *sql.DB) DB {
    27  	return DB{
    28  		DbQueryer: DbQueryer{
    29  			SqlQueryer: db,
    30  		},
    31  		DB: db,
    32  	}
    33  }
    34  
    35  //表示一个数据库Queryer
    36  // 可以拿去查数据库,
    37  type DbQueryer struct {
    38  	SqlQueryer
    39  }
    40  
    41  // 表示一个数据事务
    42  // 这个只有一条连接
    43  type Tx struct {
    44  	DbQueryer
    45  	*sql.Tx
    46  }
    47  
    48  func (q Tx) Query(query string, args ...string) (output []map[string]string, err error) {
    49  	return q.DbQueryer.Query(query, args...)
    50  }
    51  
    52  func (q Tx) Exec(query string, args ...string) (sql.Result, error) {
    53  	return q.DbQueryer.Exec(query, args...)
    54  }
    55  
    56  func NewTx(tx *sql.Tx) Tx {
    57  	return Tx{
    58  		DbQueryer: DbQueryer{
    59  			SqlQueryer: tx,
    60  		},
    61  		Tx: tx,
    62  	}
    63  }
    64  
    65  type SqlQueryer interface {
    66  	Query(query string, args ...interface{}) (*sql.Rows, error)
    67  	Exec(query string, args ...interface{}) (sql.Result, error)
    68  }
    69  
    70  type SqlTxer interface {
    71  	Commit() error
    72  	Rollback() error
    73  }
    74  
    75  var dbLock sync.Mutex
    76  var db DB
    77  
    78  func GetDb() DB {
    79  	dbLock.Lock()
    80  	defer dbLock.Unlock()
    81  	if db.DB == nil {
    82  		if defaultDbConfig == nil {
    83  			panic("you need use SetDefaultDbConfig to set the database config")
    84  		}
    85  		odb, err := sql.Open("mysql", defaultDbConfig.GetDsn())
    86  		if err != nil {
    87  			panic(err)
    88  		}
    89  		db = NewDb(odb)
    90  	}
    91  	return db
    92  }