db_helper.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. package dao
  2. import (
  3. "DataShare/global"
  4. "DataShare/model"
  5. "database/sql"
  6. "encoding/json"
  7. "errors"
  8. _ "gitee.com/chunanyong/dm"
  9. _ "github.com/go-sql-driver/mysql"
  10. "regexp"
  11. "strings"
  12. "time"
  13. _ "github.com/lib/pq"
  14. "github.com/sirupsen/logrus"
  15. _ "kingbase.com/gokb"
  16. )
  17. func DbConnect(sqlType string,connInfo string)(*sql.DB,error){
  18. //test:root:123456@(127.0.0.1:3306)/rw_system_db?charset=utf8&parseTime=True&loc=Local
  19. // connInfo := "root:123456@(127.0.0.1:3306)/mysql_test?charset=utf8&parseTime=True&loc=Local
  20. // connInfo := "dm://SYSDBA:SYSDBA@localhost:5236" ==>dm8
  21. // connInfo := "host=127.0.0.1 port=8000 user=rooot password=123456 dbname=pg_test sslmode=disable" ==>pg
  22. var err error
  23. var db *sql.DB
  24. if sqlType == "mysql"{
  25. db, err = sql.Open("mysql", connInfo)
  26. if err != nil {
  27. global.SystemLogger.Log(logrus.ErrorLevel,"open mysql failed, err:%s",err.Error())
  28. return nil,err
  29. }
  30. }else if sqlType == "dm8"{
  31. db, err = sql.Open("dm", connInfo)
  32. if err != nil {
  33. global.SystemLogger.Log(logrus.ErrorLevel,"open mysql failed, err:%s",err.Error())
  34. return nil,err
  35. }
  36. }else if sqlType == "postgres"{
  37. db, err = sql.Open("postgres", connInfo)
  38. if err != nil {
  39. global.SystemLogger.Log(logrus.ErrorLevel,"open postgres failed, err:%s",err.Error())
  40. return nil,err
  41. }
  42. }else if sqlType == "kingbase"{
  43. db, err = sql.Open("kingbase", connInfo)
  44. if err != nil {
  45. global.SystemLogger.Log(logrus.ErrorLevel,"open mysql failed, err:%s",err.Error())
  46. return nil,err
  47. }
  48. }else{
  49. return nil, errors.New("不支持的数据库类型")
  50. }
  51. err = db.Ping()
  52. if err != nil {
  53. global.SystemLogger.Log(logrus.ErrorLevel,"ping mysql failed, err:%s",err.Error())
  54. return nil,err
  55. }
  56. //todo:并发配置
  57. if sqlType == "mysql"{
  58. db.SetMaxIdleConns(global.SystemConfig.Mysql.Conn.MaxIdleConn)
  59. db.SetMaxOpenConns(global.SystemConfig.Mysql.Conn.MaxOpenConn)
  60. db.SetConnMaxLifetime(5 * time.Minute)
  61. }
  62. return db,nil
  63. }
  64. func GetCount(db *sql.DB,sqlString string, params ...interface{}) (int,error){
  65. total := 0
  66. stmt, err := db.Prepare(sqlString)
  67. if err != nil {
  68. global.SystemLogger.Log(logrus.ErrorLevel,"Prepare(%s) failed, err:%s ",sqlString,err.Error())
  69. return 0, err
  70. }
  71. defer stmt.Close()
  72. var rows *sql.Rows
  73. rows, err = stmt.Query(params...)
  74. if err != nil {
  75. global.SystemLogger.Log(logrus.ErrorLevel,"query sql(%s) ,param(%v) failed, err:%s ",sqlString,params,err.Error())
  76. return 0, err
  77. }
  78. defer rows.Close()
  79. _, err = rows.Columns()
  80. if err != nil {
  81. global.SystemLogger.Log(logrus.ErrorLevel,"rows.Columns sql(%s) ,param(%v) failed, err:%s ",sqlString,params,err.Error())
  82. return 0, err
  83. }
  84. if rows.Next() {
  85. err = rows.Scan(&total)
  86. }
  87. return total, err
  88. }
  89. func GetOneData(db *sql.DB, sqlString string, params ...interface{}) (map[string]interface{}, error) {
  90. stmt, err := db.Prepare(sqlString)
  91. if err != nil {
  92. global.SystemLogger.Log(logrus.ErrorLevel,"Prepare(%s) failed, err:%s ",sqlString,err.Error())
  93. return nil, err
  94. }
  95. defer stmt.Close()
  96. var rows *sql.Rows
  97. rows, err = stmt.Query(params...)
  98. if err != nil {
  99. global.SystemLogger.Log(logrus.ErrorLevel,"query sql(%s) ,param(%v) failed, err:%s ",sqlString,params,err.Error())
  100. return nil, err
  101. }
  102. defer rows.Close()
  103. columns, err := rows.Columns()
  104. if err != nil {
  105. global.SystemLogger.Log(logrus.ErrorLevel,"rows.Columns sql(%s) ,param(%v) failed, err:%s ",sqlString,params,err.Error())
  106. return nil, err
  107. }
  108. tableData := make([]map[string]interface{}, 0)
  109. count := len(columns)
  110. values := make([]interface{}, count)
  111. scanArgs := make([]interface{}, count)
  112. for i := range values {
  113. scanArgs[i] = &values[i]
  114. }
  115. for rows.Next() {
  116. err := rows.Scan(scanArgs...)
  117. if err != nil {
  118. global.SystemLogger.Log(logrus.ErrorLevel,"rows.Scan sql(%s) ,param(%v) failed, err:%s ",sqlString,params,err.Error())
  119. return nil, err
  120. }
  121. entry := make(map[string]interface{})
  122. for i, col := range columns {
  123. v := values[i]
  124. b, ok := v.([]byte)
  125. if (ok) {
  126. entry[col] = string(b)
  127. } else {
  128. //所有都转换成字符串输出
  129. //strVal := fmt.Sprintf("%v",v)
  130. //entry[col] = strVal
  131. //原类型输出
  132. entry[col] = v
  133. }
  134. }
  135. tableData = append(tableData, entry)
  136. }
  137. if len(tableData)>0{
  138. return tableData[0],nil
  139. }
  140. return nil, nil
  141. }
  142. func GetData(db *sql.DB, sqlString string, params ...interface{}) ([]map[string]interface{},[]byte,string,int, error) {
  143. stmt, err := db.Prepare(sqlString)
  144. if err != nil {
  145. global.SystemLogger.Log(logrus.ErrorLevel,"Prepare(%s) failed, err:%s ",sqlString,err.Error())
  146. return nil,nil,"", 0,err
  147. }
  148. defer stmt.Close()
  149. var rows *sql.Rows
  150. rows, err = stmt.Query(params...)
  151. if err != nil {
  152. global.SystemLogger.Log(logrus.ErrorLevel,"query sql(%s) ,param(%v) failed, err:%s ",sqlString,params,err.Error())
  153. return nil,nil,"",0, err
  154. }
  155. defer rows.Close()
  156. columns, err := rows.Columns()
  157. if err != nil {
  158. global.SystemLogger.Log(logrus.ErrorLevel,"rows.Columns sql(%s) ,param(%v) failed, err:%s ",sqlString,params,err.Error())
  159. return nil,nil,"",0, err
  160. }
  161. tableData := make([]map[string]interface{}, 0)
  162. count := len(columns)
  163. values := make([]interface{}, count)
  164. scanArgs := make([]interface{}, count)
  165. for i := range values {
  166. scanArgs[i] = &values[i]
  167. }
  168. for rows.Next() {
  169. err := rows.Scan(scanArgs...)
  170. if err != nil {
  171. global.SystemLogger.Log(logrus.ErrorLevel,"rows.Scan sql(%s) ,param(%v) failed, err:%s ",sqlString,params,err.Error())
  172. return nil,nil,"",0, err
  173. }
  174. entry := make(map[string]interface{})
  175. for i, col := range columns {
  176. v := values[i]
  177. b, ok := v.([]byte)
  178. if (ok) {
  179. entry[col] = string(b)
  180. } else {
  181. //所有都转换成字符串输出
  182. //strVal := fmt.Sprintf("%v",v)
  183. //entry[col] = strVal
  184. //原类型输出
  185. entry[col] = v
  186. }
  187. }
  188. tableData = append(tableData, entry)
  189. }
  190. jsonData, err := json.Marshal(tableData)
  191. if err != nil {
  192. global.SystemLogger.Log(logrus.ErrorLevel,"json.Marshal failed, err:%s ",err.Error())
  193. return nil,nil,"",0, err
  194. }
  195. total := 0
  196. if strings.Contains(sqlString,"SQL_CALC_FOUND_ROWS") {
  197. total,err = GetCount(db,"SELECT FOUND_ROWS() as total")
  198. }
  199. return tableData,jsonData,string(jsonData),total, nil
  200. }
  201. func GetData2(db *sql.DB, sqlString string,cols []model.Access_Data_Colnums, params ...interface{}) ([]map[string]interface{},[]byte,string,int, error) {
  202. stmt, err := db.Prepare(sqlString)
  203. if err != nil {
  204. global.SystemLogger.Log(logrus.ErrorLevel,"Prepare(%s) failed, err:%s ",sqlString,err.Error())
  205. return nil,nil,"", 0,err
  206. }
  207. defer stmt.Close()
  208. var rows *sql.Rows
  209. rows, err = stmt.Query(params...)
  210. if err != nil {
  211. global.SystemLogger.Log(logrus.ErrorLevel,"query sql(%s) ,param(%v) failed, err:%s ",sqlString,params,err.Error())
  212. return nil,nil,"",0, err
  213. }
  214. defer rows.Close()
  215. columns, err := rows.Columns()
  216. if err != nil {
  217. global.SystemLogger.Log(logrus.ErrorLevel,"rows.Columns sql(%s) ,param(%v) failed, err:%s ",sqlString,params,err.Error())
  218. return nil,nil,"",0, err
  219. }
  220. tableData := make([]map[string]interface{}, 0)
  221. count := len(columns)
  222. values := make([]interface{}, count)
  223. scanArgs := make([]interface{}, count)
  224. for i := range values {
  225. scanArgs[i] = &values[i]
  226. }
  227. for rows.Next() {
  228. err := rows.Scan(scanArgs...)
  229. if err != nil {
  230. global.SystemLogger.Log(logrus.ErrorLevel,"rows.Scan sql(%s) ,param(%v) failed, err:%s ",sqlString,params,err.Error())
  231. return nil,nil,"",0, err
  232. }
  233. entry := make(map[string]interface{})
  234. for i, col := range columns {
  235. for zz:=0;zz<len(cols);zz++{
  236. if col == cols[zz].Name {
  237. v := values[i]
  238. b, ok := v.([]byte)
  239. if (ok) {
  240. entry[col] = string(b)
  241. } else {
  242. //所有都转换成字符串输出
  243. //strVal := fmt.Sprintf("%v",v)
  244. //entry[col] = strVal
  245. //原类型输出
  246. entry[col] = v
  247. }
  248. //这里断言如果不正确,则把它洛道上面的[]byte类型中,省去断言
  249. _,ok = entry[col].(string)
  250. if ok {
  251. if cols[zz].DesensitizationRule!=nil{
  252. //脱敏处理
  253. //fmt.Println("val:",entry[col])
  254. //fmt.Println("regstr:",cols[zz].DesensitizationRule.RegStr)
  255. //fmt.Println("FillStr:",cols[zz].DesensitizationRule.FillStr)
  256. reg := regexp.MustCompile(cols[zz].DesensitizationRule.RegStr)
  257. entry[col] = reg.ReplaceAllString(entry[col].(string),cols[zz].DesensitizationRule.FillStr)
  258. }
  259. }
  260. break;
  261. }
  262. }
  263. //v := values[i]
  264. //b, ok := v.([]byte)
  265. //if (ok) {
  266. // entry[col] = string(b)
  267. //} else {
  268. // //所有都转换成字符串输出
  269. // //strVal := fmt.Sprintf("%v",v)
  270. // //entry[col] = strVal
  271. // //原类型输出
  272. // entry[col] = v
  273. //}
  274. ////这里断言如果不正确,则把它洛道上面的[]byte类型中,省去断言
  275. //_,ok = entry[col].(string)
  276. //if ok {
  277. // for j:=0;j<len(cols);j++{
  278. // if col == cols[j].Name && cols[j].DesensitizationRule!=nil{
  279. // //脱敏处理
  280. // reg := regexp.MustCompile(cols[j].DesensitizationRule.RegStr)
  281. // entry[col] = reg.ReplaceAllString(entry[col].(string),cols[j].DesensitizationRule.FillStr)
  282. // break;
  283. // }
  284. // }
  285. //}
  286. }
  287. tableData = append(tableData, entry)
  288. }
  289. jsonData, err := json.Marshal(tableData)
  290. if err != nil {
  291. global.SystemLogger.Log(logrus.ErrorLevel,"json.Marshal failed, err:%s ",err.Error())
  292. return nil,nil,"",0, err
  293. }
  294. total := 0
  295. if strings.Contains(sqlString,"SQL_CALC_FOUND_ROWS") {
  296. total,err = GetCount(db,"SELECT FOUND_ROWS() as total")
  297. }
  298. return tableData,jsonData,string(jsonData),total, nil
  299. }
  300. func Exec(db *sql.DB, sqlString string, params ...interface{}) (error) {
  301. stmt, err := db.Prepare(sqlString)
  302. if err != nil {
  303. global.SystemLogger.Log(logrus.ErrorLevel,"Prepare(%s) failed, err:%s ",sqlString,err.Error())
  304. return err
  305. }
  306. defer stmt.Close()
  307. _, err = stmt.Exec(params...)
  308. if err != nil {
  309. global.SystemLogger.Log(logrus.ErrorLevel,"stmt Exec sql(%s) ,param(%v) failed, err:%s ",sqlString,params,err.Error())
  310. return err
  311. }
  312. return err
  313. }
  314. func Insert(db *sql.DB, sqlString string, params ...interface{}) (int64,error) {
  315. stmt, err := db.Prepare(sqlString)
  316. if err != nil {
  317. global.SystemLogger.Log(logrus.ErrorLevel,"Prepare(%s) failed, err:%s ",sqlString,err.Error())
  318. return 0,err
  319. }
  320. defer stmt.Close()
  321. result, err := stmt.Exec(params...)
  322. if err != nil {
  323. global.SystemLogger.Log(logrus.ErrorLevel,"stmt Exec sql(%s) ,param(%v) failed, err:%s ",sqlString,params,err.Error())
  324. return 0,err
  325. }
  326. return result.LastInsertId()
  327. }