github.com/sereiner/library@v0.0.0-20200518095232-1fa3e640cc5f/db/sys_db.go (about) 1 package db 2 3 import ( 4 "database/sql" 5 "errors" 6 "fmt" 7 "strings" 8 "time" 9 //_ "github.com/mattn/go-oci8" 10 //_ "github.com/mattn/go-sqlite3" 11 //_ "gopkg.in/rana/ora.v4" 12 ) 13 14 /* 15 github.com/mattn/go-oci8 16 17 http://www.simonzhang.net/?p=2890 18 http://blog.sina.com.cn/s/blog_48c95a190102w2ln.html 19 http://www.tudou.com/programs/view/yet9OngrV_4/ 20 https://github.com/wendal/go-oci8/downloads 21 https://github.com/wendal/go-oci8 22 23 安装方法 24 1. 下载:http://www.oracle.com/technetwork/database/features/instant-client/index.html 25 2. 解压文件 unzip instantclient-basic-linux.x64-12.1.0.1.0.zip -d /usr/local/ 26 3. 配置环境变量 27 vi .bash_profile 28 export ora_home=/usr/local/instantclient_12_1 29 export PATH=$PATH:$ora_home 30 export LD_LIBRARY_PATH=$ora_home 31 32 33 */ 34 35 const ( 36 //SQLITE3 Sqlite3数据库 37 SQLITE3 = "sqlite3" 38 //OCI8 oralce数据库 39 OCI8 = "oci8" 40 //ORA oralce数据库 41 ORA = "ora" 42 ) 43 44 type ISysDB interface { 45 Query(string, ...interface{}) (QueryRows, []string, error) 46 Execute(string, ...interface{}) (int64, error) 47 Executes(string, ...interface{}) (int64, int64, error) 48 Begin() (ISysDBTrans, error) 49 Close() 50 } 51 52 //ISysDBTrans 数据库事务接口 53 type ISysDBTrans interface { 54 Query(string, ...interface{}) (QueryRows, []string, error) 55 Execute(string, ...interface{}) (int64, error) 56 Executes(query string, args ...interface{}) (lastInsertId, affectedRow int64, err error) 57 Rollback() error 58 Commit() error 59 } 60 61 //SysDB 数据库实体 62 type SysDB struct { 63 provider string 64 connString string 65 db *sql.DB 66 maxIdle int 67 maxOpen int 68 } 69 70 //NewSysDB 创建DB实例 71 func NewSysDB(provider string, connString string, maxOpen int, maxIdle int, maxLifeTime time.Duration) (obj *SysDB, err error) { 72 if provider == "" || connString == "" { 73 err = errors.New("provider or connString not allow nil") 74 return 75 } 76 obj = &SysDB{provider: provider, connString: connString} 77 switch strings.ToLower(provider) { 78 case "ora", "oracle": 79 obj.db, err = sql.Open(OCI8, connString) 80 case "sqlite": 81 obj.db, err = sql.Open(SQLITE3, connString) 82 default: 83 obj.db, err = sql.Open(provider, connString) 84 } 85 if err != nil { 86 return 87 } 88 obj.db.SetMaxIdleConns(maxIdle) 89 obj.db.SetMaxOpenConns(maxOpen) 90 obj.db.SetConnMaxLifetime(maxLifeTime) 91 err = obj.db.Ping() 92 return 93 } 94 95 //Query 执行SQL查询语句 96 func (db *SysDB) Query(query string, args ...interface{}) (dataRows QueryRows, colus []string, err error) { 97 rows, err := db.db.Query(query, args...) 98 if err != nil { 99 if rows != nil { 100 rows.Close() 101 } 102 return 103 } 104 defer rows.Close() 105 dataRows, colus, err = resolveRows(rows, 0) 106 return 107 108 } 109 110 func resolveRows(rows *sql.Rows, col int) (dataRows []QueryRow, columns []string, err error) { 111 dataRows = make([]QueryRow, 0) 112 colus, err := rows.Columns() 113 if err != nil { 114 return 115 } 116 columns = make([]string, 0, len(colus)) 117 for _, v := range colus { 118 columns = append(columns, strings.ToLower(v)) 119 } 120 121 for rows.Next() { 122 row := make(QueryRow) 123 dataRows = append(dataRows, row) 124 var buffer []interface{} 125 for index := 0; index < len(columns); index++ { 126 var va []byte 127 buffer = append(buffer, &va) 128 } 129 err = rows.Scan(buffer...) 130 if err != nil { 131 return 132 } 133 for index := 0; index < len(columns) && (index < col || col == 0); index++ { 134 key := columns[index] 135 value := buffer[index] 136 if value == nil { 137 continue 138 } else { 139 // buff := value.(*[]byte) 140 //row[key] = bytes.NewBuffer(*buff).String() 141 row[key] = strings.TrimPrefix(fmt.Sprintf("%s", value), "&") 142 } 143 } 144 } 145 return 146 } 147 148 //Executes 执行SQL操作语句 149 func (db *SysDB) Executes(query string, args ...interface{}) (lastInsertId, affectedRow int64, err error) { 150 result, err := db.db.Exec(query, args...) 151 if err != nil { 152 return 153 } 154 lastInsertId, err = result.LastInsertId() 155 affectedRow, err = result.RowsAffected() 156 return 157 } 158 159 //Execute 执行SQL操作语句 160 func (db *SysDB) Execute(query string, args ...interface{}) (affectedRow int64, err error) { 161 result, err := db.db.Exec(query, args...) 162 if err != nil { 163 return 164 } 165 return result.RowsAffected() 166 } 167 168 //Begin 创建一个事务请求 169 func (db *SysDB) Begin() (r ISysDBTrans, err error) { 170 t := &SysDBTransaction{} 171 t.tx, err = db.db.Begin() 172 return t, err 173 } 174 175 func (db *SysDB) Print() { 176 fmt.Printf("maxIdle: %+v\n", db.db.Stats()) 177 fmt.Println("maxOpen: ", db.maxOpen) 178 } 179 func (db *SysDB) Close() { 180 db.db.Close() 181 }