sql_utils.go 28 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073
  1. package restful
  2. import (
  3. "database/sql"
  4. "errors"
  5. "fmt"
  6. "math"
  7. "strconv"
  8. "strings"
  9. "time"
  10. "unsafe"
  11. "tmr-watch/conf/setting"
  12. _ "github.com/denisenkom/go-mssqldb"
  13. _ "github.com/go-sql-driver/mysql"
  14. "github.com/patrickmn/go-cache"
  15. "github.com/tealeg/xlsx"
  16. "github.com/xormplus/xorm"
  17. )
  18. var (
  19. Engine *xorm.Engine
  20. SqlServerEngine *xorm.Engine
  21. Apisql_cache *cache.Cache
  22. )
  23. func SQLT() *xorm.Session {
  24. tx := Engine.NewSession()
  25. return tx
  26. }
  27. // SQLInit 初始化数据库操作句柄,这里要提供:
  28. // driverName string: 数据库类型,例如mysql、sqlite等,参考github.com/go-sql-driver/mysql官方介绍
  29. // dataSourceName string: 数据库地址,参考github.com/go-sql-driver/mysql官方介绍
  30. // MaxOpenConns int: 最大缓存连接数,这个数值包含了MaxIdleConns
  31. // MaxIdleConns int:预备的最大空闲连接数
  32. func SQLInit(driverName, dataSourceName string, maxOpenConns, maxIdleConns int, showlog bool) error {
  33. if Engine == nil {
  34. var err error
  35. if Engine, err = xorm.NewEngine(driverName, dataSourceName); err != nil {
  36. return err
  37. }
  38. if showlog {
  39. Engine.ShowSQL(true)
  40. }
  41. Engine.SetMaxIdleConns(maxIdleConns)
  42. Engine.SetMaxOpenConns(maxOpenConns)
  43. }
  44. if Apisql_cache == nil {
  45. Apisql_cache = cache.New(600*time.Second, 10*time.Second)
  46. SetCacheSql()
  47. }
  48. if SqlServerEngine == nil && setting.SQlserverSetting.Host != "" {
  49. // setting.SQlserverSetting.Host = "server=192.168.1.152\\MYSQL;user id=sa;password=1;database=SysData;encrypt=disable"
  50. sqlserverSourceName := fmt.Sprintf("server=%s;user id=%s;password=%s;database=%s;encrypt=disable", setting.SQlserverSetting.Host,
  51. setting.SQlserverSetting.User, setting.SQlserverSetting.Password, setting.SQlserverSetting.Name)
  52. var err error
  53. fmt.Println(1, sqlserverSourceName)
  54. SqlServerEngine, err = xorm.NewEngine("mssql", sqlserverSourceName)
  55. if err != nil {
  56. fmt.Println(err, 3, sqlserverSourceName)
  57. return err
  58. }
  59. if err = SqlServerEngine.Ping(); err != nil {
  60. panic(err)
  61. }
  62. fmt.Println(2, sqlserverSourceName)
  63. if showlog {
  64. SqlServerEngine.ShowSQL(true)
  65. }
  66. SqlServerEngine.SetMaxIdleConns(maxIdleConns)
  67. SqlServerEngine.SetMaxOpenConns(maxOpenConns)
  68. // count1, err := SqlServerEngine.Table("PFGL").QueryString()
  69. // fmt.Println(err, 4, count1)
  70. }
  71. return nil
  72. }
  73. func SetCacheSql() {
  74. valuesMap, err := Engine.SQL("SELECT sqlname, CONCAT(sqlstr,'|',IFNULL(params,'')) AS sqlstr FROM apisql WHERE ENABLE>0 ").QueryString()
  75. if err == nil && len(valuesMap) > 0 {
  76. for _, v := range valuesMap {
  77. Apisql_cache.Set(v["sqlname"], v["sqlstr"], cache.DefaultExpiration)
  78. }
  79. }
  80. }
  81. func sqlCheckParam(param string) error {
  82. /*if strings.Contains(param, "where") {
  83. return errors.New("can not have where")
  84. }
  85. if strings.Contains(param, "and") {
  86. return errors.New("can not have and")
  87. }
  88. if strings.Contains(param, "or") {
  89. return errors.New("can not have or")
  90. }
  91. if strings.Contains(param, "=") {
  92. return errors.New("can not have =")
  93. }*/
  94. if strings.Contains(param, ";") {
  95. return errors.New("can not have ;")
  96. }
  97. return nil
  98. }
  99. func GetSqlByName(name string, tx *xorm.Session) (string, string) {
  100. sqls := ""
  101. param := ""
  102. if sql, ok := Apisql_cache.Get(name); ok {
  103. tempstrb := strings.IndexAny(sql.(string), "|")
  104. sqls = sql.(string)[0:tempstrb]
  105. param = sql.(string)[tempstrb+1:]
  106. } else {
  107. valuesMap, err := tx.SQL("SELECT sqlstr, params FROM apisql WHERE sqlname = ? AND ENABLE>0 ", name).QueryString()
  108. if err == nil && len(valuesMap) > 0 {
  109. sqls = valuesMap[0]["sqlstr"]
  110. param = valuesMap[0]["params"]
  111. Apisql_cache.Set(name, (sqls + "|" + param), cache.DefaultExpiration)
  112. }
  113. }
  114. if setting.DatabaseSetting.ShowGetSqllog {
  115. fmt.Println("apisql:" + sqls)
  116. fmt.Println("param:" + param)
  117. }
  118. return sqls, param
  119. }
  120. func GetSqlByNameDB(name string) (string, string) {
  121. sqls := ""
  122. param := ""
  123. if sql, ok := Apisql_cache.Get(name); ok && setting.DatabaseSetting.CacheApiSql {
  124. tempstrb := strings.IndexAny(sql.(string), "|")
  125. sqls = sql.(string)[0:tempstrb]
  126. param = sql.(string)[tempstrb+1:]
  127. } else {
  128. valuesMap, err := Engine.SQL("SELECT sqlstr,params FROM apisql WHERE sqlname = ? AND ENABLE>0 ", name).QueryString()
  129. if err == nil && len(valuesMap) > 0 {
  130. sqls = valuesMap[0]["sqlstr"]
  131. param = valuesMap[0]["params"]
  132. Apisql_cache.Set(name, (sqls + "|" + param), cache.DefaultExpiration)
  133. }
  134. }
  135. if setting.DatabaseSetting.ShowGetSqllog {
  136. fmt.Println("apisql:" + sqls)
  137. fmt.Println("param:" + param)
  138. }
  139. return sqls, param
  140. }
  141. func GetSqlByNameDBT(name string, tx *xorm.Session) (string, string) {
  142. sqls := ""
  143. param := ""
  144. if sql, ok := Apisql_cache.Get(name); ok && setting.DatabaseSetting.CacheApiSql {
  145. tempstrb := strings.IndexAny(sql.(string), "|")
  146. sqls = sql.(string)[0:tempstrb]
  147. param = sql.(string)[tempstrb+1:]
  148. } else {
  149. valuesMap, err := tx.SQL("SELECT sqlstr,params FROM apisql WHERE sqlname = ? AND ENABLE>0 ", name).QueryString()
  150. if err == nil && len(valuesMap) > 0 {
  151. sqls = valuesMap[0]["sqlstr"]
  152. param = valuesMap[0]["params"]
  153. Apisql_cache.Set(name, (sqls + "|" + param), cache.DefaultExpiration)
  154. }
  155. }
  156. if setting.DatabaseSetting.ShowGetSqllog {
  157. fmt.Println("apisql:" + sqls)
  158. fmt.Println("param:" + param)
  159. }
  160. return sqls, param
  161. }
  162. // sqlGetValues 根据结构体中指向实际数据的指针获取出数据,并存储到另一张表中返回
  163. func sqlGetValues(pvs []interface{}, columnsType []*sql.ColumnType, columnsLen int) map[string]interface{} {
  164. result := make(map[string]interface{}, columnsLen)
  165. for a := 0; a < columnsLen; a++ {
  166. switch s := pvs[a].(type) {
  167. case *int8:
  168. result[columnsType[a].Name()] = *s
  169. case *int16:
  170. result[columnsType[a].Name()] = *s
  171. case *int32:
  172. result[columnsType[a].Name()] = *s
  173. case *int64:
  174. result[columnsType[a].Name()] = *s
  175. case *float32:
  176. result[columnsType[a].Name()] = *s
  177. case *float64:
  178. result[columnsType[a].Name()] = *s
  179. case *string:
  180. result[columnsType[a].Name()] = *s
  181. case *sql.NullInt64:
  182. result[columnsType[a].Name()] = *s
  183. case *sql.NullString:
  184. result[columnsType[a].Name()] = *s
  185. }
  186. }
  187. return result
  188. }
  189. // 这里返回的是原始数组的基础上加上了字段名标识
  190. func sqlQuery(columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) ([]map[string]interface{}, error) {
  191. jsondata := make([]map[string]interface{}, queryCount)
  192. for k1, v1 := range queryData {
  193. if k1 >= queryCount {
  194. break
  195. }
  196. jsondata[k1] = sqlGetValues(v1, columnsType, columnsLen)
  197. }
  198. return jsondata, nil
  199. }
  200. func sqlQueryByTinyIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[int8]map[string]interface{}, error) {
  201. jsondata := make(map[int8]map[string]interface{}, queryCount)
  202. for k1, v1 := range queryData {
  203. if k1 >= queryCount {
  204. break
  205. }
  206. for a := 0; a < columnsLen; a++ {
  207. if columnsType[a].Name() == columnName {
  208. if value, ok := v1[a].(*int8); ok {
  209. jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
  210. }
  211. break
  212. }
  213. }
  214. }
  215. return jsondata, nil
  216. }
  217. func sqlQueryBySmallIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[int16]map[string]interface{}, error) {
  218. jsondata := make(map[int16]map[string]interface{}, queryCount)
  219. for k1, v1 := range queryData {
  220. if k1 >= queryCount {
  221. break
  222. }
  223. for a := 0; a < columnsLen; a++ {
  224. if columnsType[a].Name() == columnName {
  225. if value, ok := v1[a].(*int16); ok {
  226. jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
  227. }
  228. break
  229. }
  230. }
  231. }
  232. return jsondata, nil
  233. }
  234. func sqlQueryByIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[int32]map[string]interface{}, error) {
  235. jsondata := make(map[int32]map[string]interface{}, queryCount)
  236. for k1, v1 := range queryData {
  237. if k1 >= queryCount {
  238. break
  239. }
  240. for a := 0; a < columnsLen; a++ {
  241. if columnsType[a].Name() == columnName {
  242. if value, ok := v1[a].(*int32); ok {
  243. jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
  244. }
  245. break
  246. }
  247. }
  248. }
  249. return jsondata, nil
  250. }
  251. func sqlQueryByBigIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[int64]map[string]interface{}, error) {
  252. jsondata := make(map[int64]map[string]interface{}, queryCount)
  253. for k1, v1 := range queryData {
  254. if k1 >= queryCount {
  255. break
  256. }
  257. for a := 0; a < columnsLen; a++ {
  258. if columnsType[a].Name() == columnName {
  259. if value, ok := v1[a].(*int64); ok {
  260. jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
  261. }
  262. break
  263. }
  264. }
  265. }
  266. return jsondata, nil
  267. }
  268. func sqlQueryByFloatIntMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[float32]map[string]interface{}, error) {
  269. jsondata := make(map[float32]map[string]interface{}, queryCount)
  270. for k1, v1 := range queryData {
  271. if k1 >= queryCount {
  272. break
  273. }
  274. for a := 0; a < columnsLen; a++ {
  275. if columnsType[a].Name() == columnName {
  276. if value, ok := v1[a].(*float32); ok {
  277. jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
  278. }
  279. break
  280. }
  281. }
  282. }
  283. return jsondata, nil
  284. }
  285. func sqlQueryByDoubleMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[float64]map[string]interface{}, error) {
  286. jsondata := make(map[float64]map[string]interface{}, queryCount)
  287. for k1, v1 := range queryData {
  288. if k1 >= queryCount {
  289. break
  290. }
  291. for a := 0; a < columnsLen; a++ {
  292. if columnsType[a].Name() == columnName {
  293. if value, ok := v1[a].(*float64); ok {
  294. jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
  295. }
  296. break
  297. }
  298. }
  299. }
  300. return jsondata, nil
  301. }
  302. func sqlQueryByStringMap(columnName string, columnsType []*sql.ColumnType, columnsLen int, queryData [][]interface{}, queryCount int) (map[string]map[string]interface{}, error) {
  303. jsondata := make(map[string]map[string]interface{}, queryCount)
  304. for k1, v1 := range queryData {
  305. if k1 >= queryCount {
  306. break
  307. }
  308. for a := 0; a < columnsLen; a++ {
  309. if columnsType[a].Name() == columnName {
  310. if value, ok := v1[a].(*string); ok {
  311. jsondata[*value] = sqlGetValues(v1, columnsType, columnsLen)
  312. }
  313. break
  314. }
  315. }
  316. }
  317. return jsondata, nil
  318. }
  319. func sqlGetColumnType(columnsType []*sql.ColumnType, columnsLen int, valueName string) string {
  320. for a := 0; a < columnsLen; a++ {
  321. if columnsType[a].Name() == valueName {
  322. return columnsType[a].DatabaseTypeName()
  323. }
  324. }
  325. return ""
  326. }
  327. func round(num float64) int {
  328. return int(num + math.Copysign(0.5, num))
  329. }
  330. func toFixed(num float64, precision int) float64 {
  331. output := math.Pow(10, float64(precision))
  332. return float64(round(num*output)) / output
  333. }
  334. // QueryByMap 将查询到的数据,按照指定字段的值做为索引构建map并返回
  335. // columnName string: 作为索引的字段名称
  336. // sql string: 查询需要获取哪些字段的值,就是select后面跟着的部分,一般用"*"
  337. // where string: 过滤条件,就是where后面跟着的部分
  338. // order string: 排序条件,就是order by后面跟着的部分。默认是ASC排序,除非"-"开头则DESC排序
  339. // offset string: limit后面逗号相隔的两个数值,前者就是offset,后者就是count
  340. // count string: limit后面逗号相隔的两个数值,前者就是offset,后者就是count
  341. func QueryByMap(sqlstr string, offset, count int, params []interface{}) (interface{}, error) {
  342. if err := sqlCheckParam(sqlstr); err != nil {
  343. return 0, err
  344. }
  345. recordcount := int64(0)
  346. if count > 1 {
  347. tt, err := Engine.SQL("SELECT COUNT(*) as count FROM ("+sqlstr+") a", params...).Query().List()
  348. if err != nil {
  349. fmt.Println("s1", err)
  350. return nil, err
  351. }
  352. if tt == nil {
  353. recordcount = 0
  354. } else {
  355. recordcount = tt[0]["count"].(int64)
  356. }
  357. }
  358. queryData := make([]map[string]interface{}, 1)
  359. var err error
  360. if count == 0 {
  361. queryData, err = Engine.SQL(sqlstr, params...).Query().List()
  362. } else {
  363. if count > 0 && offset > 0 {
  364. offset = offset * count
  365. }
  366. queryData, err = Engine.SQL(sqlstr, params...).Limit(count, offset).Query().List()
  367. }
  368. //fmt.Println("count, offset==================",count, offset)
  369. if err != nil {
  370. return nil, err
  371. }
  372. if recordcount == 0 {
  373. recordcount = int64(len(queryData))
  374. }
  375. data := make(map[string]interface{})
  376. data["list"] = queryData
  377. data["total"] = recordcount
  378. data["code"] = 0
  379. data["message"] = "ok"
  380. if count > 0 {
  381. data["pages"] = math.Ceil(float64(recordcount) / float64(count))
  382. data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))
  383. }
  384. data["pageSize"] = count
  385. return data, nil
  386. }
  387. func QueryByMapT(sqlstr string, offset, count int, params []interface{}, tx *xorm.Session) (interface{}, error) {
  388. if err := sqlCheckParam(sqlstr); err != nil {
  389. return 0, err
  390. }
  391. recordcount := int64(0)
  392. firstPos := strings.IndexByte(sqlstr, '?')
  393. if count > 1 {
  394. var params1 []interface{}
  395. if firstPos != -1 {
  396. for i, a :=range params{
  397. if i== 2 {
  398. params1 = append(params1,0)
  399. } else if i == 3 {
  400. params1 = append(params1,99999)
  401. }else{
  402. params1 = append(params1,a)
  403. }
  404. }
  405. tt, err := tx.SQL(` select count(DISTINCT bar.id ) count from bar
  406. LEFT JOIN feedp fp
  407. ON bar.id = fp.barid AND fp.pastureid=?
  408. LEFT JOIN fpdetail fpd
  409. ON fp.barid = fpd.barid AND fpd.times<=(SELECT inforvalue FROM sysopt
  410. WHERE sysopt.pastureid= ? AND sysopt.inforname= 'times') AND fpd.pastureid=?
  411. LEFT JOIN feedtemplet ft
  412. ON ft.id = fp.ftid and ft.pastureid=bar.pastureid
  413. LEFT JOIN feedtemplet ft1
  414. ON ft1.id = fp.ptsfid and ft1.pastureid=bar.pastureid
  415. WHERE bar.pastureid=? AND bar.enable=1
  416. AND (bar.id = ? or ? = '')
  417. AND (bar.pen = ? or ? = '')
  418. AND (ft.tname like concat("%",?,"%") or ? = '') `, params1[0],params1[0],params1[0],params1[0],params1[5],params1[5],params1[7],params1[7],params1[9],params1[9]).Query().List()
  419. fmt.Println( params1[0],params1[0],params1[0],params1[0],params1[5],params1[5],params1[7],params1[7],params1[9],params1[9])
  420. if err != nil {
  421. fmt.Println("s1", err)
  422. return nil, err
  423. }
  424. if tt == nil {
  425. recordcount = 0
  426. } else {
  427. switch tt[0]["count"].(type) {
  428. case int64:
  429. recordcount = tt[0]["count"].(int64)
  430. case string:
  431. temp, _ := strconv.Atoi(tt[0]["count"].(string))
  432. recordcount = int64(temp)
  433. }
  434. }
  435. }else{
  436. // params1 = append(params1, params...)
  437. tt, err := tx.SQL("SELECT COUNT(*) as count FROM ("+sqlstr+") a", params...).Query().List()
  438. if err != nil {
  439. fmt.Println("s1", err)
  440. return nil, err
  441. }
  442. if tt == nil {
  443. recordcount = 0
  444. } else {
  445. switch tt[0]["count"].(type) {
  446. case int64:
  447. recordcount = tt[0]["count"].(int64)
  448. case string:
  449. temp, _ := strconv.Atoi(tt[0]["count"].(string))
  450. recordcount = int64(temp)
  451. }
  452. }
  453. }
  454. }
  455. queryData := make([]map[string]interface{}, 1)
  456. var err error
  457. if count == 0 ||firstPos > 0 {
  458. queryData, err = tx.SQL(sqlstr, params...).Query().List()
  459. } else {
  460. if count > 0 && offset > 0 {
  461. offset = offset * count
  462. }
  463. queryData, err = tx.SQL(sqlstr, params...).Limit(count, offset).Query().List()
  464. }
  465. //fmt.Println("count, offset==================",count, offset)
  466. if err != nil {
  467. return nil, err
  468. }
  469. if recordcount == 0 {
  470. recordcount = int64(len(queryData))
  471. }
  472. data := make(map[string]interface{})
  473. data["list"] = queryData
  474. data["total"] = recordcount
  475. data["code"] = 0
  476. data["message"] = "ok"
  477. if count > 0 {
  478. data["pages"] = math.Ceil(float64(recordcount) / float64(count))
  479. data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))
  480. }
  481. data["pageSize"] = count
  482. return data, nil
  483. }
  484. // QueryByXlsx 将查询到的数据,按照指定字段的值做为索引构建map并返回
  485. // sql string: 查询需要获取哪些字段的值,就是select后面跟着的部分,一般用"*"
  486. // params string: 过滤条件,就是where后面跟着的部分
  487. func QueryByXlsx(sqlstr string, params []interface{}) (*xlsx.File, error) {
  488. if err := sqlCheckParam(sqlstr); err != nil {
  489. return nil, err
  490. }
  491. rows, err := Engine.SQL(sqlstr, params...).QueryRows()
  492. if err != nil {
  493. return nil, err
  494. }
  495. defer rows.Close()
  496. columnsType, _ := rows.ColumnTypes()
  497. columnsLen := len(columnsType)
  498. columns, _ := rows.Columns()
  499. values := make([]interface{}, columnsLen)
  500. valuePtrs := make([]interface{}, columnsLen)
  501. var sheet *xlsx.Sheet
  502. var row *xlsx.Row
  503. var cell *xlsx.Cell
  504. file := xlsx.NewFile()
  505. sheet, err = file.AddSheet("Sheet1")
  506. if err != nil {
  507. fmt.Printf(err.Error())
  508. }
  509. row = sheet.AddRow()
  510. for _, columnname := range columns {
  511. cell = row.AddCell()
  512. cell.Value = columnname
  513. }
  514. for rows.Next() {
  515. for a := 0; a < columnsLen; a++ {
  516. valuePtrs[a] = &values[a]
  517. }
  518. rows.Scan(valuePtrs...)
  519. row = sheet.AddRow()
  520. for i, _ := range columns {
  521. var v interface{}
  522. val := values[i]
  523. b, ok := val.([]byte)
  524. cell = row.AddCell()
  525. if ok {
  526. v1 := string(b)
  527. switch columnsType[i].DatabaseTypeName() {
  528. case "TINYINT", "SMALLINT", "MEDIUMINT", "INT", "INTEGER", "BIGINT":
  529. {
  530. v, _ = strconv.ParseInt(v1, 10, 32)
  531. cell.Value = fmt.Sprintf("%v", v)
  532. }
  533. case "FLOAT", "DOUBLE", "DECIMAL":
  534. {
  535. cindex := len(val.([]byte)) - strings.Index(v1, ".") - 1
  536. v2, _ := strconv.ParseFloat(v1, 32)
  537. v = toFixed(v2, cindex)
  538. cell.Value = fmt.Sprintf("%v", v)
  539. }
  540. case "BOOL":
  541. {
  542. v, _ = strconv.ParseBool(v1)
  543. cell.Value = fmt.Sprintf("%v", v)
  544. }
  545. default:
  546. {
  547. v = v1
  548. cell.Value = fmt.Sprintf("%v", v)
  549. }
  550. }
  551. } else {
  552. v = val
  553. cell.Value = fmt.Sprintf("%v", v)
  554. }
  555. if cell.Value == "<nil>" {
  556. cell.Value = ""
  557. }
  558. }
  559. }
  560. return file, nil
  561. }
  562. // QueryByMap 将查询到的数据,按照指定字段的值做为索引构建map并返回
  563. // columnName string: 作为索引的字段名称
  564. // sql string: 查询需要获取哪些字段的值,就是select后面跟着的部分,一般用"*"
  565. // where string: 过滤条件,就是where后面跟着的部分
  566. // order string: 排序条件,就是order by后面跟着的部分。默认是ASC排序,除非"-"开头则DESC排序
  567. // offset string: limit后面逗号相隔的两个数值,前者就是offset,后者就是count
  568. // count string: limit后面逗号相隔的两个数值,前者就是offset,后者就是count
  569. func QueryByMapMenu(sqlstr string, offset, count int, params []interface{}) ([]map[string]interface{}, error) {
  570. if err := sqlCheckParam(sqlstr); err != nil {
  571. return nil, err
  572. }
  573. if offset < 0 {
  574. offset = 0
  575. }
  576. if count <= 0 {
  577. count = 0
  578. }
  579. if count > 0 {
  580. sqlstr += " limit " + strconv.Itoa(offset) + "," + strconv.Itoa(count)
  581. }
  582. rows, err := Engine.SQL(sqlstr, params...).QueryRows()
  583. if err != nil {
  584. return nil, err
  585. }
  586. defer rows.Close()
  587. columnsType, _ := rows.ColumnTypes()
  588. columnsLen := len(columnsType)
  589. columns, _ := rows.Columns()
  590. queryData := make([]map[string]interface{}, 0)
  591. values := make([]interface{}, columnsLen)
  592. valuePtrs := make([]interface{}, columnsLen)
  593. for rows.Next() {
  594. for a := 0; a < columnsLen; a++ {
  595. valuePtrs[a] = &values[a]
  596. }
  597. rows.Scan(valuePtrs...)
  598. entry := make(map[string]interface{})
  599. for i, col := range columns {
  600. entry[col] = getValue(values[i], columnsType[i].DatabaseTypeName())
  601. }
  602. queryData = append(queryData, entry)
  603. }
  604. data := queryData
  605. return data, nil
  606. //return Engine.SQL(sqlstr, params...).Query().List()
  607. }
  608. func QueryByList(sqlstr string, offset, count int, params []interface{}) (interface{}, error) {
  609. if err := sqlCheckParam(sqlstr); err != nil {
  610. return 0, err
  611. }
  612. if count == 0 {
  613. count = 1000
  614. }
  615. recordcount := int64(0)
  616. if count > 1 {
  617. tt, err := Engine.SQL("SELECT COUNT(*) as count FROM ("+sqlstr+") a", params...).Query().List()
  618. if err != nil {
  619. return nil, err
  620. }
  621. recordcount = tt[0]["count"].(int64)
  622. }
  623. queryData := make([]map[string]interface{}, 1)
  624. var err error
  625. if count == 0 {
  626. queryData, err = Engine.SQL(sqlstr, params...).Query().List()
  627. } else {
  628. if count > 0 && offset > 0 {
  629. offset = offset * count
  630. }
  631. queryData, err = Engine.SQL(sqlstr, params...).Limit(count, offset).Query().List()
  632. }
  633. if err != nil {
  634. return nil, err
  635. }
  636. columnsname := make([]string, 0)
  637. listdata := make(map[string][]interface{})
  638. if len(queryData) > 0 {
  639. for i, _ := range queryData {
  640. if i == 0 {
  641. for i, _ := range queryData[0] {
  642. columnsname = append(columnsname, i)
  643. }
  644. }
  645. for _, v := range columnsname {
  646. listdata[v] = append(listdata[v], queryData[i][v])
  647. }
  648. }
  649. recordcount = int64(len(queryData))
  650. }
  651. data := make(map[string]interface{})
  652. data["lists"] = listdata
  653. //data["columnsname"] = columnsname
  654. data["total"] = recordcount
  655. data["code"] = 0
  656. data["message"] = "ok"
  657. if count > 0 {
  658. data["pages"] = math.Ceil(float64(recordcount) / float64(count))
  659. data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))
  660. }
  661. data["pageSize"] = count
  662. return data, nil
  663. }
  664. func QueryByListList(sqlstr string, offset, count int, params []interface{}) (interface{}, error) {
  665. if err := sqlCheckParam(sqlstr); err != nil {
  666. return 0, err
  667. }
  668. if count == 0 {
  669. count = 1000
  670. }
  671. recordcount := int64(0)
  672. if count > 1 {
  673. tt, err := Engine.SQL("SELECT COUNT(*) as count FROM ("+sqlstr+") a", params...).Query().List()
  674. if err != nil {
  675. return nil, err
  676. }
  677. recordcount = tt[0]["count"].(int64)
  678. }
  679. queryData := make([]map[string]interface{}, 1)
  680. var err error
  681. if count == 0 {
  682. queryData, err = Engine.SQL(sqlstr, params...).Query().List()
  683. } else {
  684. if count > 0 && offset > 0 {
  685. offset = offset * count
  686. }
  687. queryData, err = Engine.SQL(sqlstr, params...).Limit(count, offset).Query().List()
  688. }
  689. if err != nil {
  690. return nil, err
  691. }
  692. columnsname := make([]string, 0)
  693. listdata := make([]interface{}, 0)
  694. if len(queryData) > 0 {
  695. for i, _ := range queryData {
  696. if i == 0 {
  697. for i, _ := range queryData[0] {
  698. columnsname = append(columnsname, i)
  699. }
  700. }
  701. listdatarow := make([]interface{}, 0)
  702. for _, v := range columnsname {
  703. listdatarow = append(listdatarow, queryData[i][v])
  704. }
  705. listdata = append(listdata, listdatarow)
  706. }
  707. recordcount = int64(len(queryData))
  708. }
  709. data := make(map[string]interface{})
  710. data["list"] = listdata
  711. data["columnsname"] = columnsname
  712. data["total"] = recordcount
  713. data["code"] = 0
  714. data["message"] = "ok"
  715. if count > 0 {
  716. data["pages"] = math.Ceil(float64(recordcount) / float64(count))
  717. data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))
  718. }
  719. data["pageSize"] = count
  720. return data, nil
  721. }
  722. func QueryByListT(sqlstr string, offset, count int, params []interface{}, tx *xorm.Session) (interface{}, error) {
  723. if err := sqlCheckParam(sqlstr); err != nil {
  724. return 0, err
  725. }
  726. if count == 0 {
  727. count = 1000
  728. }
  729. recordcount := int64(0)
  730. if count > 1 {
  731. tt, err := tx.SQL("SELECT COUNT(*) as count FROM ("+sqlstr+") a", params...).Query().List()
  732. if err != nil {
  733. return nil, err
  734. }
  735. switch tt[0]["count"].(type) {
  736. case int64:
  737. recordcount = tt[0]["count"].(int64)
  738. case string:
  739. temp, _ := strconv.Atoi(tt[0]["count"].(string))
  740. recordcount = int64(temp)
  741. }
  742. }
  743. queryData := make([]map[string]interface{}, 1)
  744. var err error
  745. if count == 0 {
  746. queryData, err = tx.SQL(sqlstr, params...).Query().List()
  747. } else {
  748. if count > 0 && offset > 0 {
  749. offset = offset * count
  750. }
  751. queryData, err = tx.SQL(sqlstr, params...).Limit(count, offset).Query().List()
  752. }
  753. if err != nil {
  754. return nil, err
  755. }
  756. columnsname := make([]string, 0)
  757. listdata := make(map[string][]interface{})
  758. if len(queryData) > 0 {
  759. for i, _ := range queryData {
  760. if i == 0 {
  761. for i, _ := range queryData[0] {
  762. columnsname = append(columnsname, i)
  763. }
  764. }
  765. for _, v := range columnsname {
  766. listdata[v] = append(listdata[v], queryData[i][v])
  767. }
  768. }
  769. recordcount = int64(len(queryData))
  770. }
  771. data := make(map[string]interface{})
  772. data["lists"] = listdata
  773. //data["columnsname"] = columnsname
  774. data["total"] = recordcount
  775. data["code"] = 0
  776. data["message"] = "ok"
  777. if count > 0 {
  778. data["pages"] = math.Ceil(float64(recordcount) / float64(count))
  779. data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))
  780. }
  781. data["pageSize"] = count
  782. return data, nil
  783. }
  784. func QueryByListListT(sqlstr string, offset, count int, params []interface{}, tx *xorm.Session) (interface{}, error) {
  785. if err := sqlCheckParam(sqlstr); err != nil {
  786. return 0, err
  787. }
  788. if count == 0 {
  789. count = 1000
  790. }
  791. recordcount := int64(0)
  792. if count > 1 {
  793. tt, err := tx.SQL("SELECT COUNT(*) as count FROM ("+sqlstr+") a", params...).Query().List()
  794. if err != nil {
  795. return nil, err
  796. }
  797. switch tt[0]["count"].(type) {
  798. case int64:
  799. recordcount = tt[0]["count"].(int64)
  800. case string:
  801. temp, _ := strconv.Atoi(tt[0]["count"].(string))
  802. recordcount = int64(temp)
  803. }
  804. }
  805. queryData := make([]map[string]interface{}, 1)
  806. var err error
  807. if count == 0 {
  808. queryData, err = tx.SQL(sqlstr, params...).Query().List()
  809. } else {
  810. if count > 0 && offset > 0 {
  811. offset = offset * count
  812. }
  813. queryData, err = tx.SQL(sqlstr, params...).Limit(count, offset).Query().List()
  814. }
  815. if err != nil {
  816. return nil, err
  817. }
  818. columnsname := make([]string, 0)
  819. listdata := make([]interface{}, 0)
  820. if len(queryData) > 0 {
  821. for i, _ := range queryData {
  822. if i == 0 {
  823. for i, _ := range queryData[0] {
  824. columnsname = append(columnsname, i)
  825. }
  826. }
  827. listdatarow := make([]interface{}, 0)
  828. for _, v := range columnsname {
  829. listdatarow = append(listdatarow, queryData[i][v])
  830. }
  831. listdata = append(listdata, listdatarow)
  832. }
  833. recordcount = int64(len(queryData))
  834. }
  835. data := make(map[string]interface{})
  836. data["list"] = listdata
  837. data["columnsname"] = columnsname
  838. data["total"] = recordcount
  839. data["code"] = 0
  840. data["message"] = "ok"
  841. if count > 0 {
  842. data["pages"] = math.Ceil(float64(recordcount) / float64(count))
  843. data["pageNum"] = math.Ceil(float64(offset+1) / float64(count))
  844. }
  845. data["pageSize"] = count
  846. return data, nil
  847. }
  848. func ExecQuery(sqlstr string, params []interface{}) (interface{}, error) {
  849. if err := sqlCheckParam(sqlstr); err != nil {
  850. return 0, err
  851. }
  852. rows, err := Engine.SQL(sqlstr, params...).Execute()
  853. if err != nil {
  854. return nil, err
  855. }
  856. data := make(map[string]interface{})
  857. LastInsertId, _ := rows.LastInsertId()
  858. idPointer := (*int)(unsafe.Pointer(&LastInsertId))
  859. idd16 := *idPointer
  860. RowsAffected, _ := rows.RowsAffected()
  861. _idPointer := (*int)(unsafe.Pointer(&RowsAffected))
  862. _idd16 := *_idPointer
  863. data["result"] = rows
  864. data["LastInsertId"] = idd16
  865. data["RowsAffected"] = _idd16
  866. return data, nil
  867. }
  868. func ExecQueryT(sqlstr string, params []interface{}, tx *xorm.Session) (interface{}, error) {
  869. if err := sqlCheckParam(sqlstr); err != nil {
  870. return 0, err
  871. }
  872. rows, err := tx.SQL(sqlstr, params...).Execute()
  873. if err != nil {
  874. fmt.Println("exe", err)
  875. return nil, err
  876. }
  877. LastInsertId, err := rows.LastInsertId()
  878. idPointer := (*int)(unsafe.Pointer(&LastInsertId))
  879. idd16 := *idPointer
  880. data := make(map[string]interface{})
  881. RowsAffected, _ := rows.RowsAffected()
  882. _idPointer := (*int)(unsafe.Pointer(&RowsAffected))
  883. _idd16 := *_idPointer
  884. data["LastInsertId"] = strconv.Itoa(idd16)
  885. data["LastInsertIdStr"] = idd16
  886. data["RowsAffected"] = _idd16
  887. data["result"] = rows
  888. return data, nil
  889. }
  890. func ExecQuerys(sqlstr string, params []interface{}) (interface{}, error) {
  891. if err := sqlCheckParam(sqlstr); err != nil {
  892. return 0, err
  893. }
  894. /*for i, v := range params{
  895. _, err := dbs.Exec(sqlstr, v[i]...)
  896. if err != nil {
  897. return nil, err
  898. }
  899. }
  900. */
  901. data := make(map[string]interface{})
  902. data["result"] = nil
  903. return data, nil
  904. }
  905. func getValue(value interface{}, CT string) interface{} {
  906. var v interface{}
  907. val := value
  908. b, ok := val.([]byte)
  909. if ok {
  910. v1 := string(b)
  911. switch CT {
  912. case "TINYINT", "SMALLINT", "MEDIUMINT", "INT", "INTEGER", "BIGINT":
  913. {
  914. v, _ = strconv.ParseInt(v1, 10, 32)
  915. }
  916. case "FLOAT", "DOUBLE", "DECIMAL":
  917. {
  918. cindex := len(val.([]byte)) - strings.Index(v1, ".") - 1
  919. v2, _ := strconv.ParseFloat(v1, 32)
  920. v = toFixed(v2, cindex)
  921. }
  922. case "BOOL":
  923. {
  924. v, _ = strconv.ParseBool(v1)
  925. }
  926. default:
  927. {
  928. v = v1
  929. }
  930. }
  931. } else {
  932. v = val
  933. }
  934. return v
  935. }
  936. func ExecQueryList(sqlstr string, params []interface{}) (interface{}, error) {
  937. if err := sqlCheckParam(sqlstr); err != nil {
  938. return 0, err
  939. }
  940. rows, err := Engine.SQL(sqlstr, params...).QueryString()
  941. if err != nil {
  942. return nil, err
  943. }
  944. data := make(map[string]interface{})
  945. for _, item := range rows {
  946. data["result"] = item
  947. }
  948. return data, nil
  949. }