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 }