数据库操作
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

973 lines
21 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
8 months ago
8 months ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. package dbquery
  2. import (
  3. "database/sql"
  4. "log"
  5. "strconv"
  6. "errors"
  7. "strings"
  8. "time"
  9. "git.tetele.net/tgo/helper"
  10. _ "github.com/go-sql-driver/mysql"
  11. )
  12. /**
  13. * 创建数据
  14. */
  15. func Insert(dbName, table string, data map[string]string) (int64, error) {
  16. var insertId int64
  17. var err error
  18. if dbName == "" && table == "" {
  19. return insertId, errors.New("没有数据表")
  20. }
  21. if strings.Contains(table, "select ") {
  22. dbName = table
  23. } else {
  24. dbName = getTableName(dbName, table)
  25. }
  26. if len(data) < 1 {
  27. return insertId, errors.New("没有要写入的数据")
  28. }
  29. keyList := make([]string, len(data))
  30. keyStr := make([]string, len(data))
  31. valueList := make([]interface{}, len(data))
  32. var i int = 0
  33. for key, value := range data {
  34. keyList[i] = key
  35. keyStr[i] = "?"
  36. valueList[i] = value
  37. i++
  38. }
  39. result, err := DB.Exec("insert into "+dbName+" ("+strings.Join(keyList, ",")+") value("+strings.Join(keyStr, ",")+")", valueList...)
  40. if err != nil {
  41. log.Println("ERROR|插入", dbName, "数据失败,", err)
  42. return insertId, err
  43. } else {
  44. insertId, _ = result.LastInsertId()
  45. time.Sleep(time.Second * 2)
  46. return insertId, nil
  47. }
  48. }
  49. /**
  50. * 修改数据
  51. */
  52. func Update(dbName, table string, data map[string]string, where map[string]string) (int64, error) {
  53. var rowsAffected int64
  54. var err error
  55. if dbName == "" && table == "" {
  56. return rowsAffected, errors.New("没有数据表")
  57. }
  58. if strings.Contains(table, "select ") {
  59. dbName = table
  60. } else {
  61. dbName = getTableName(dbName, table)
  62. }
  63. if len(data) < 1 {
  64. return rowsAffected, errors.New("同有更新的数据")
  65. }
  66. if len(where) < 1 {
  67. return rowsAffected, errors.New("没有更新条件")
  68. }
  69. keyList := make([]string, len(data))
  70. valueList := make([]interface{}, len(data), len(data)+len(where))
  71. whereStr := make([]string, len(where))
  72. var i int = 0
  73. empty := false
  74. for key, value := range data {
  75. keyList[i] = key + "=?"
  76. valueList[i] = value
  77. i++
  78. }
  79. i = 0
  80. for key, value := range where {
  81. if value == "" {
  82. empty = true
  83. break
  84. }
  85. whereStr[i] = key + "=?"
  86. valueList = append(valueList, value)
  87. i++
  88. }
  89. if empty {
  90. log.Println("ERROR|修改数据表", dbName, "时条件中有空数据,条件:", where, "数据:", data)
  91. return rowsAffected, errors.New("条件中有空数据")
  92. }
  93. result, err := DB.Exec("update "+dbName+" set "+strings.Join(keyList, " , ")+" where "+strings.Join(whereStr, " and "), valueList...)
  94. if err != nil {
  95. log.Println("ERROR|修改", dbName, "数据失败,", err)
  96. return rowsAffected, err
  97. } else {
  98. rowsAffected, _ = result.RowsAffected()
  99. return rowsAffected, nil
  100. }
  101. }
  102. /**
  103. * 删除数据
  104. * @param count 删除数量
  105. */
  106. func Delete(dbName, table string, data map[string]string, del_count ...string) (int64, error) {
  107. var count int64
  108. var err error
  109. if dbName == "" && table == "" {
  110. return count, errors.New("没有数据表")
  111. }
  112. if strings.Contains(table, "select ") {
  113. dbName = table
  114. } else {
  115. dbName = getTableName(dbName, table)
  116. }
  117. if len(data) < 1 {
  118. return count, errors.New("没有要删除的数据")
  119. }
  120. keyList := make([]string, len(data))
  121. valueList := make([]interface{}, len(data))
  122. var i int = 0
  123. empty := false
  124. for key, value := range data {
  125. if value == "" {
  126. empty = true
  127. break
  128. }
  129. keyList[i] = key + "=?"
  130. valueList[i] = value
  131. i++
  132. }
  133. if empty {
  134. log.Println("ERROR|删除数据表", dbName, "时条件中有空数据,条件:", data)
  135. return count, errors.New("条件中有空数据")
  136. }
  137. var limitStr string = ""
  138. if len(del_count) > 0 {
  139. limitStr = " limit " + del_count[0]
  140. }
  141. result, err := DB.Exec("delete from "+dbName+" where "+strings.Join(keyList, " and ")+limitStr, valueList...)
  142. if err != nil {
  143. log.Println("ERROR|删除", dbName, "数据失败,", err)
  144. return count, err
  145. } else {
  146. count, _ = result.RowsAffected()
  147. return count, nil
  148. }
  149. }
  150. /**
  151. * 查找一条记录
  152. * @param dbName 数据表名
  153. * @param title 查询字段名
  154. */
  155. func GetData(dbName, table string, title string, where map[string]string, limit map[string]string) (int, map[string]string, error) {
  156. var count int = 0
  157. info := make(map[string]string)
  158. if dbName == "" && table == "" {
  159. return count, info, errors.New("没有数据表")
  160. }
  161. dbName = getTableName(dbName, table)
  162. if len(title) < 1 {
  163. return count, info, errors.New("没有指定查询内容")
  164. }
  165. var limitStr string = ""
  166. if limit != nil && len(limit) > 0 {
  167. var from string = "0" //开始
  168. if _, ok := limit["order"]; ok {
  169. limitStr += " order by " + limit["order"]
  170. }
  171. if _, ok := limit["from"]; ok {
  172. from = limit["from"]
  173. }
  174. limitStr += " limit " + from + ",1"
  175. } else {
  176. limitStr = " limit 1"
  177. }
  178. if len(where) < 1 {
  179. return count, info, errors.New("Query condition is empty")
  180. }
  181. keyList := make([]string, len(where))
  182. valueList := make([]interface{}, len(where))
  183. var i int = 0
  184. empty := false
  185. for key, value := range where {
  186. if value == "" {
  187. empty = true
  188. break
  189. }
  190. keyList[i] = key + " = ? "
  191. valueList[i] = value
  192. i++
  193. }
  194. if empty {
  195. return count, info, errors.New("Query condition is empty")
  196. }
  197. var rows *sql.Rows
  198. var err error
  199. var queryNum int = 0
  200. for queryNum < 3 { //如发生错误,继续查询3次,防止数据库连接断开问题
  201. rows, err = DB.Query("SELECT "+title+" FROM "+dbName+" where "+strings.Join(keyList, " and ")+" "+limitStr, valueList...)
  202. if err == nil {
  203. break
  204. } else {
  205. log.Println("ERROR", "Query from", dbName, "failed,", err, "| SELECT "+title+" FROM "+dbName+" where "+strings.Join(keyList, " and ")+" "+limitStr)
  206. time.Sleep(time.Millisecond * 500)
  207. }
  208. queryNum++
  209. }
  210. defer rows.Close()
  211. if err != nil {
  212. return count, info, err
  213. }
  214. columns, _ := rows.Columns()
  215. scanArgs := make([]interface{}, len(columns))
  216. values := make([]interface{}, len(columns))
  217. for i := range values {
  218. scanArgs[i] = &values[i]
  219. }
  220. var index string
  221. var rowerr error
  222. for rows.Next() {
  223. rowerr = rows.Scan(scanArgs...)
  224. if rowerr == nil {
  225. for i, col := range values {
  226. if col != nil {
  227. index = helper.StrFirstToUpper(columns[i])
  228. info[index] = helper.ToString(col)
  229. }
  230. }
  231. count++
  232. } else {
  233. log.Println("ERROR", "rows scan error", rowerr, dbName, keyList, valueList)
  234. }
  235. }
  236. if rowerr != nil {
  237. return count, info, rowerr
  238. }
  239. return count, info, nil
  240. }
  241. /**
  242. * 查找一条记录
  243. * @param dbName 数据表名
  244. * @param title 查询字段名
  245. */
  246. func GetRow(dbName, table_name, alias string, titles string, join [][]string, where, where_or []string, valueList []interface{}, orderby, groupby, having string, debug bool) (int, map[string]string, error) {
  247. var count int = 0
  248. info := make(map[string]string)
  249. if dbName == "" && table_name == "" {
  250. return count, info, errors.New("没有数据表")
  251. }
  252. table := ""
  253. if strings.Contains(table_name, "select ") {
  254. table = table_name
  255. } else {
  256. table = getTableName(dbName, table_name)
  257. }
  258. var sql_str, title string
  259. if titles != "" {
  260. title = titles
  261. } else {
  262. title = "*"
  263. }
  264. if DB_PROVIDER == "TencentDB" {
  265. sql_str = helper.StringJoin("/*slave*/ select ", title)
  266. } else {
  267. sql_str = helper.StringJoin("select ", title)
  268. }
  269. if alias != "" {
  270. table = helper.StringJoin(table, " as ", alias)
  271. }
  272. sql_str = helper.StringJoin(sql_str, " from ", table)
  273. if len(join) > 0 {
  274. for _, joinitem := range join {
  275. if len(joinitem) < 2 {
  276. continue
  277. }
  278. if len(joinitem) == 4 {
  279. sql_str = helper.StringJoin(sql_str, " ", joinitem[2], " join ", joinitem[0], " on ", joinitem[1])
  280. } else if len(joinitem) == 3 {
  281. sql_str = helper.StringJoin(sql_str, " ", joinitem[2], " join ", getTableName(dbName, joinitem[0]), " on ", joinitem[1])
  282. } else { //默认左连接
  283. sql_str = helper.StringJoin(sql_str, " left join ", getTableName(dbName, joinitem[0]), " on ", joinitem[1])
  284. }
  285. }
  286. }
  287. if len(where) > 0 || len(where_or) > 0 {
  288. sql_str = helper.StringJoin(sql_str, " where ")
  289. }
  290. if len(where) > 0 {
  291. sql_str = helper.StringJoin(sql_str, " (", strings.Join(where, " and "), " ) ")
  292. }
  293. if len(where_or) > 0 {
  294. if len(where) > 0 {
  295. sql_str = helper.StringJoin(sql_str, " or ", strings.Join(where_or, " or "))
  296. } else {
  297. sql_str = helper.StringJoin(sql_str, strings.Join(where_or, " or "))
  298. }
  299. }
  300. if groupby != "" {
  301. sql_str = helper.StringJoin(sql_str, " group by ", groupby)
  302. }
  303. if having != "" {
  304. sql_str = helper.StringJoin(sql_str, " having ", having)
  305. }
  306. if orderby != "" {
  307. sql_str = helper.StringJoin(sql_str, " order by ", orderby)
  308. }
  309. if debug {
  310. log.Println("query sql:", sql_str, valueList)
  311. }
  312. condition_len := 0 //所有条件数
  313. for _, ch2 := range sql_str {
  314. if string(ch2) == "?" {
  315. condition_len++
  316. }
  317. }
  318. if condition_len != len(valueList) {
  319. return 0, nil, errors.New("参数错误,条件值错误")
  320. }
  321. var rows *sql.Rows
  322. var err error
  323. var queryNum int = 0
  324. sql_str = helper.StringJoin(sql_str, " limit 1")
  325. var db *sql.DB
  326. if SLAVER_DB != nil {
  327. db = SLAVER_DB
  328. } else {
  329. db = DB
  330. }
  331. for queryNum < 2 { //如发生错误,继续查询2次,防止数据库连接断开问题
  332. rows, err = db.Query(sql_str, valueList...)
  333. if err == nil {
  334. break
  335. } else {
  336. log.Println(err)
  337. time.Sleep(time.Millisecond * 500)
  338. }
  339. queryNum++
  340. }
  341. if err != nil {
  342. log.Println("DB error:", err)
  343. rows.Close()
  344. return count, info, err
  345. }
  346. columns, _ := rows.Columns()
  347. scanArgs := make([]interface{}, len(columns))
  348. values := make([]interface{}, len(columns))
  349. for i := range values {
  350. scanArgs[i] = &values[i]
  351. }
  352. var index string
  353. var rowerr error
  354. for rows.Next() {
  355. rowerr = rows.Scan(scanArgs...)
  356. if rowerr == nil {
  357. for i, col := range values {
  358. if col != nil {
  359. index = helper.StrFirstToUpper(columns[i])
  360. info[index] = helper.ToString(col)
  361. }
  362. }
  363. count++
  364. } else {
  365. log.Println("ERROR", rowerr)
  366. }
  367. }
  368. rows.Close()
  369. if rowerr != nil {
  370. log.Println("DB row error:", rowerr)
  371. return count, info, rowerr
  372. }
  373. return count, info, nil
  374. }
  375. /**
  376. * 查找多条记录
  377. * @param dbName 数据表名
  378. * @param title 查询字段名
  379. */
  380. func FetchRows(dbName, table_name, alias string, titles string, join [][]string, where, where_or []string, valueList []interface{}, orderby, groupby, having string, page int, page_size int, debug bool) (int, []map[string]string, error) {
  381. var count int = 0
  382. list := make([]map[string]string, 0)
  383. if dbName == "" && table_name == "" {
  384. return count, list, errors.New("没有数据表")
  385. }
  386. table := ""
  387. if strings.Contains(table_name, "select ") {
  388. table = table_name
  389. } else {
  390. table = getTableName(dbName, table_name)
  391. }
  392. var sql_str, title string
  393. if titles != "" {
  394. title = titles
  395. } else {
  396. title = "*"
  397. }
  398. if DB_PROVIDER == "TencentDB" {
  399. sql_str = helper.StringJoin("/*slave*/ select ", title)
  400. } else {
  401. sql_str = helper.StringJoin("select ", title)
  402. }
  403. if alias != "" {
  404. table = helper.StringJoin(table, " as ", alias)
  405. }
  406. sql_str = helper.StringJoin(sql_str, " from ", table)
  407. if len(join) > 0 {
  408. for _, joinitem := range join {
  409. if len(joinitem) < 2 {
  410. continue
  411. }
  412. if len(joinitem) == 4 {
  413. sql_str = helper.StringJoin(sql_str, " ", joinitem[2], " join ", joinitem[0], " on ", joinitem[1])
  414. } else if len(joinitem) == 3 {
  415. sql_str = helper.StringJoin(sql_str, " ", joinitem[2], " join ", getTableName(dbName, joinitem[0]), " on ", joinitem[1])
  416. } else { //默认左连接
  417. sql_str = helper.StringJoin(sql_str, " left join ", getTableName(dbName, joinitem[0]), " on ", joinitem[1])
  418. }
  419. }
  420. }
  421. if len(where) > 0 || len(where_or) > 0 {
  422. sql_str = helper.StringJoin(sql_str, " where ")
  423. }
  424. if len(where) > 0 {
  425. sql_str = helper.StringJoin(sql_str, " (", strings.Join(where, " and "), " ) ")
  426. }
  427. if len(where_or) > 0 {
  428. if len(where) > 0 {
  429. sql_str = helper.StringJoin(sql_str, " or ", strings.Join(where_or, " or "))
  430. } else {
  431. sql_str = helper.StringJoin(sql_str, strings.Join(where_or, " or "))
  432. }
  433. }
  434. if groupby != "" {
  435. sql_str = helper.StringJoin(sql_str, " group by ", groupby)
  436. }
  437. if having != "" {
  438. sql_str = helper.StringJoin(sql_str, " HAVING ", having)
  439. }
  440. if orderby != "" {
  441. sql_str = helper.StringJoin(sql_str, " order by ", orderby)
  442. }
  443. if page > 0 || page_size > 0 {
  444. if page < 1 {
  445. page = 1
  446. }
  447. if page_size < 1 {
  448. page_size = 10
  449. }
  450. from := strconv.Itoa((page - 1) * page_size)
  451. offset := strconv.Itoa(page_size)
  452. if from != "" && offset != "" {
  453. sql_str = helper.StringJoin(sql_str, " limit ", from, " , ", offset)
  454. }
  455. }
  456. if debug {
  457. log.Println("query sql:", sql_str, valueList)
  458. }
  459. condition_len := 0 //所有条件数
  460. for _, ch2 := range sql_str {
  461. if string(ch2) == "?" {
  462. condition_len++
  463. }
  464. }
  465. if condition_len != len(valueList) {
  466. return 0, list, errors.New("参数错误,条件值错误")
  467. }
  468. var db *sql.DB
  469. if SLAVER_DB != nil {
  470. db = SLAVER_DB
  471. } else {
  472. db = DB
  473. }
  474. var rows *sql.Rows
  475. var err error
  476. var queryNum int = 0
  477. for queryNum < 2 { //如发生错误,继续查询2次,防止数据库连接断开问题
  478. rows, err = db.Query(sql_str, valueList...)
  479. if err == nil {
  480. break
  481. } else {
  482. log.Println(err)
  483. time.Sleep(time.Millisecond * 500)
  484. }
  485. queryNum++
  486. }
  487. if err != nil {
  488. rows.Close()
  489. return 0, list, err
  490. }
  491. columns, _ := rows.Columns()
  492. scanArgs := make([]interface{}, len(columns))
  493. values := make([]interface{}, len(columns))
  494. for i := range values {
  495. scanArgs[i] = &values[i]
  496. }
  497. var index string
  498. var rowerr error
  499. var info map[string]string
  500. for rows.Next() {
  501. rowerr = rows.Scan(scanArgs...)
  502. info = make(map[string]string)
  503. if rowerr == nil {
  504. for i, col := range values {
  505. if col != nil {
  506. index = helper.StrFirstToUpper(columns[i])
  507. info[index] = helper.ToString(col)
  508. }
  509. }
  510. count++
  511. } else {
  512. log.Println("ERROR", rowerr)
  513. }
  514. if len(info) > 0 {
  515. list = append(list, info)
  516. }
  517. }
  518. rows.Close()
  519. return count, list, nil
  520. }
  521. func GetInfo(dbName, table string, title string, where map[string]string) (map[string]string, error) {
  522. count, info, gzErr := GetData(dbName, table, title, where, nil)
  523. if gzErr != nil {
  524. return info, gzErr
  525. } else {
  526. if count < 1 {
  527. return info, errors.New("No data")
  528. }
  529. return info, nil
  530. }
  531. }
  532. /**
  533. * 查询列表
  534. * 2018/04/19
  535. */
  536. func GetList(dbName, table string, title string, where map[string]string, limit map[string]string) ([]map[string]string, error) {
  537. var list []map[string]string
  538. if dbName == "" && table == "" {
  539. return list, errors.New("没有数据表")
  540. }
  541. if strings.Contains(table, "select ") {
  542. dbName = table
  543. } else {
  544. dbName = getTableName(dbName, table)
  545. }
  546. var rows *sql.Rows
  547. var err error
  548. var queryNum int = 0
  549. var limitStr string = ""
  550. if len(limit) > 0 {
  551. var offset string = "0" //偏移量,个数
  552. var from string = "" //开始
  553. if _, ok := limit["order"]; ok {
  554. limitStr += " order by " + limit["order"]
  555. }
  556. if _, ok := limit["offset"]; ok {
  557. offset = limit["offset"]
  558. }
  559. if _, ok := limit["from"]; ok {
  560. from = limit["from"]
  561. }
  562. if offset != "0" && from != "" {
  563. limitStr += " limit " + from + "," + offset
  564. }
  565. }
  566. if len(where) > 0 {
  567. valueList := make([]interface{}, len(where))
  568. whereStr := make([]string, len(where))
  569. i := 0
  570. var keys []string
  571. for key, value := range where {
  572. key = strings.Trim(key, " ")
  573. value = strings.Trim(value, " ")
  574. if value == "" || key == "" {
  575. continue
  576. // return list, errors.New("Query condition is empty")
  577. }
  578. if strings.Contains(key, " ") {
  579. //key中包含空格,判断是否不等于条件
  580. keys = strings.Split(key, " ")
  581. if helper.IsInStringArray(judg(), strings.Trim(keys[1], " ")) {
  582. whereStr[i] = strings.Trim(keys[0], " ") + " " + strings.Trim(keys[1], " ") + " ?"
  583. }
  584. } else {
  585. whereStr[i] = key + " = ?"
  586. valueList[i] = value
  587. }
  588. i++
  589. }
  590. if len(whereStr) == 0 || len(valueList) == 0 {
  591. return list, errors.New("Query condition is empty")
  592. }
  593. for queryNum < 5 { //如发生错误,继续查询5次,防止数据库连接断开问题
  594. rows, err = DB.Query("select "+title+" from "+dbName+" where "+strings.Join(whereStr, " and ")+" "+limitStr, valueList...)
  595. if err == nil {
  596. break
  597. } else {
  598. time.Sleep(time.Millisecond * 500)
  599. }
  600. queryNum++
  601. }
  602. } else {
  603. for queryNum < 5 { //如发生错误,继续查询5次,防止数据库连接断开问题
  604. rows, err = DB.Query("select " + title + " from " + dbName + " " + limitStr)
  605. if err == nil {
  606. break
  607. } else {
  608. time.Sleep(time.Millisecond * 500)
  609. }
  610. queryNum++
  611. }
  612. }
  613. if err != nil {
  614. return list, err
  615. }
  616. defer rows.Close()
  617. columns, _ := rows.Columns()
  618. scanArgs := make([]interface{}, len(columns))
  619. values := make([]interface{}, len(columns))
  620. for i := range values {
  621. scanArgs[i] = &values[i]
  622. }
  623. var record map[string]string
  624. var index string
  625. for rows.Next() {
  626. //将行数据保存到record字典
  627. err = rows.Scan(scanArgs...)
  628. record = make(map[string]string)
  629. for i, col := range values {
  630. if col != nil {
  631. index = helper.StrFirstToUpper(columns[i])
  632. record[index] = helper.ToString(col)
  633. }
  634. }
  635. list = append(list, record)
  636. }
  637. return list, nil
  638. }
  639. /**
  640. * 查询总数
  641. * 2018/04/19
  642. */
  643. func GetTotal(dbName, table string, args ...string) (total int) {
  644. if dbName == "" && table == "" {
  645. return
  646. }
  647. if strings.Contains(table, "select ") {
  648. dbName = table
  649. } else {
  650. dbName = getTableName(dbName, table)
  651. }
  652. var title string = "*"
  653. if len(args) > 0 {
  654. title = args[0]
  655. }
  656. var rows *sql.Rows
  657. var err error
  658. var queryNum int = 0
  659. for queryNum < 5 { //如发生错误,继续查询5次,防止数据库连接断开问题
  660. rows, err = DB.Query("select count(" + title + ") as count from " + dbName + " limit 1")
  661. if err == nil {
  662. break
  663. } else {
  664. time.Sleep(time.Millisecond * 500)
  665. }
  666. queryNum++
  667. }
  668. if err != nil {
  669. log.Println("ERROR|get", dbName, "total error", err)
  670. return
  671. }
  672. defer rows.Close()
  673. var count int
  674. for rows.Next() {
  675. //将行数据保存到record字典
  676. err = rows.Scan(&count)
  677. if err != nil {
  678. log.Println("ERROR|get", dbName, "total error", err)
  679. } else {
  680. total = count
  681. }
  682. }
  683. return
  684. }
  685. /**
  686. * 查询总数
  687. * 2020/06/04
  688. */
  689. func GetCount(dbName, table string, where map[string]string, args ...string) (total int) {
  690. if dbName == "" && table == "" {
  691. return
  692. }
  693. if strings.Contains(table, "select ") {
  694. dbName = table
  695. } else {
  696. dbName = getTableName(dbName, table)
  697. }
  698. var title string = "*"
  699. if len(title) > 0 {
  700. title = args[0]
  701. }
  702. var rows *sql.Rows
  703. var err error
  704. var queryNum int = 0
  705. if len(where) > 0 {
  706. valueList := make([]interface{}, len(where))
  707. whereStr := make([]string, len(where))
  708. i := 0
  709. var keys []string
  710. for key, value := range where {
  711. key = strings.Trim(key, " ")
  712. value = strings.Trim(value, " ")
  713. if value == "" || key == "" {
  714. continue
  715. // return list, errors.New("Query condition is empty")
  716. }
  717. if strings.Contains(key, " ") {
  718. //key中包含空格,判断是否不等于条件
  719. keys = strings.Split(key, " ")
  720. if helper.IsInStringArray(judg(), strings.Trim(keys[1], " ")) {
  721. whereStr[i] = strings.Trim(keys[0], " ") + " " + strings.Trim(keys[1], " ") + " ?"
  722. }
  723. } else {
  724. whereStr[i] = key + " = ?"
  725. valueList[i] = value
  726. }
  727. i++
  728. }
  729. for queryNum < 5 { //如发生错误,继续查询5次,防止数据库连接断开问题
  730. rows, err = DB.Query("select count("+title+") as count from "+dbName+" where "+strings.Join(whereStr, " and ")+" limit 1", valueList...)
  731. if err == nil {
  732. break
  733. } else {
  734. time.Sleep(time.Millisecond * 500)
  735. }
  736. queryNum++
  737. }
  738. } else {
  739. for queryNum < 5 { //如发生错误,继续查询5次,防止数据库连接断开问题
  740. rows, err = DB.Query("select count(" + title + ") as count from " + dbName + " limit 1")
  741. if err == nil {
  742. break
  743. } else {
  744. time.Sleep(time.Millisecond * 500)
  745. }
  746. queryNum++
  747. }
  748. }
  749. if err != nil {
  750. log.Println("ERROR|get", dbName, "count error", err)
  751. return
  752. }
  753. defer rows.Close()
  754. var count int
  755. for rows.Next() {
  756. //将行数据保存到record字典
  757. err = rows.Scan(&count)
  758. if err != nil {
  759. log.Println("ERROR|get", dbName, "count error", err)
  760. } else {
  761. total = count
  762. }
  763. }
  764. return
  765. }
  766. func DoQuery(args ...interface{}) ([]map[string]string, error) {
  767. var list []map[string]string
  768. if len(args) < 1 {
  769. return list, errors.New("Query condition is empty")
  770. }
  771. queryStr := helper.ToString(args[0])
  772. if queryStr == "" {
  773. return list, errors.New("Query condition is empty")
  774. }
  775. var rows *sql.Rows
  776. var err error
  777. var queryNum int = 0
  778. for queryNum < 3 { //如发生错误,继续查询5次,防止数据库连接断开问题
  779. if len(args) > 1 {
  780. rows, err = DB.Query(queryStr, args[1:]...) //strings.Join(args[1:], ",")
  781. if err != nil {
  782. log.Println("ERROR|DoQuery error:", err)
  783. }
  784. } else {
  785. rows, err = DB.Query(queryStr)
  786. if err != nil {
  787. log.Println("ERROR|DoQuery error:", err)
  788. }
  789. }
  790. if err == nil {
  791. break
  792. } else {
  793. time.Sleep(time.Millisecond * 500)
  794. }
  795. queryNum++
  796. }
  797. if err != nil {
  798. return list, err
  799. }
  800. defer rows.Close()
  801. columns, _ := rows.Columns()
  802. scanArgs := make([]interface{}, len(columns))
  803. values := make([]interface{}, len(columns))
  804. for i := range values {
  805. scanArgs[i] = &values[i]
  806. }
  807. var record map[string]string
  808. var index string
  809. for rows.Next() {
  810. //将行数据保存到record字典
  811. err = rows.Scan(scanArgs...)
  812. record = make(map[string]string)
  813. for i, col := range values {
  814. if col != nil {
  815. index = helper.StrFirstToUpper(columns[i])
  816. record[index] = helper.ToString(col)
  817. }
  818. }
  819. list = append(list, record)
  820. }
  821. return list, nil
  822. }