数据库操作
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.

842 lines
19 KiB

  1. package dbquery
  2. /**
  3. * 事务操作
  4. */
  5. import (
  6. "database/sql"
  7. "errors"
  8. "log"
  9. "strconv"
  10. "strings"
  11. "git.tetele.net/tgo/helper"
  12. )
  13. type TxQuery struct {
  14. dbname string
  15. table string
  16. alias string
  17. title string
  18. where []string
  19. where_or []string
  20. join [][]string //[["tablea as a","a.id=b.id","left"]]
  21. data []string
  22. value []interface{}
  23. save_data []map[string]interface{} //批量操作的数据[["title":"a","num":1,],["title":"a","num":1,]]
  24. upd_field []string // 批量更新时需要更新的字段,为空时按除id外的字段进行更新
  25. orderby string
  26. groupby string
  27. having string
  28. page int
  29. page_size int
  30. stmt *sql.Stmt
  31. conn *sql.DB
  32. tx *sql.Tx
  33. debug bool
  34. }
  35. func NewTxQuery(t ...string) *TxQuery {
  36. var conn_type *sql.DB = DB
  37. if len(t) > 0 {
  38. switch t[0] {
  39. case "mysql":
  40. conn_type = DB
  41. case "mssql": //sql server
  42. conn_type = MSDB_CONN
  43. }
  44. }
  45. tx, err := conn_type.Begin()
  46. if err != nil {
  47. log.Println("start tx begin error", err)
  48. }
  49. return &TxQuery{
  50. conn: conn_type,
  51. tx: tx,
  52. }
  53. }
  54. func (this *TxQuery) Conn(conn *sql.DB) *TxQuery {
  55. this.conn = conn
  56. return this
  57. }
  58. func (this *TxQuery) Db(dbname string) *TxQuery {
  59. this.dbname = dbname
  60. return this
  61. }
  62. func (this *TxQuery) Table(tablename string) *TxQuery {
  63. this.table = tablename
  64. return this
  65. }
  66. func (this *TxQuery) Alias(tablename string) *TxQuery {
  67. this.alias = tablename
  68. return this
  69. }
  70. func (this *TxQuery) Title(title string) *TxQuery {
  71. this.title = title
  72. return this
  73. }
  74. func (this *TxQuery) Page(page int) *TxQuery {
  75. this.page = page
  76. return this
  77. }
  78. func (this *TxQuery) PageSize(page_num int) *TxQuery {
  79. this.page_size = page_num
  80. return this
  81. }
  82. func (this *TxQuery) Orderby(orderby string) *TxQuery {
  83. this.orderby = orderby
  84. return this
  85. }
  86. func (this *TxQuery) Groupby(groupby string) *TxQuery {
  87. this.groupby = groupby
  88. return this
  89. }
  90. func (this *TxQuery) Having(having string) *TxQuery {
  91. this.having = having
  92. return this
  93. }
  94. func (this *TxQuery) Where(where string) *TxQuery {
  95. this.where = append(this.where, where)
  96. return this
  97. }
  98. func (this *TxQuery) Wheres(wheres []string) *TxQuery {
  99. if len(wheres) > 0 {
  100. this.where = append(this.where, wheres...)
  101. }
  102. return this
  103. }
  104. func (this *TxQuery) WhereOr(where string) *TxQuery {
  105. this.where_or = append(this.where_or, where)
  106. return this
  107. }
  108. func (this *TxQuery) Value(value interface{}) *TxQuery {
  109. this.value = append(this.value, value)
  110. return this
  111. }
  112. func (this *TxQuery) SaveData(value map[string]interface{}) *TxQuery {
  113. this.save_data = append(this.save_data, value)
  114. return this
  115. }
  116. func (this *TxQuery) SaveDatas(value []map[string]interface{}) *TxQuery {
  117. this.save_data = append(this.save_data, value...)
  118. return this
  119. }
  120. func (this *TxQuery) UpdField(value string) *TxQuery {
  121. this.upd_field = append(this.upd_field, value)
  122. return this
  123. }
  124. func (this *TxQuery) UpdFields(value []string) *TxQuery {
  125. this.upd_field = append(this.upd_field, value...)
  126. return this
  127. }
  128. func (this *TxQuery) Values(values []interface{}) *TxQuery {
  129. this.value = append(this.value, values...)
  130. return this
  131. }
  132. func (this *TxQuery) Join(join []string) *TxQuery {
  133. this.join = append(this.join, join)
  134. return this
  135. }
  136. /**
  137. * 左连接
  138. * 2023/08/10
  139. * gz
  140. */
  141. func (this *TxQuery) LeftJoin(table_name string, condition string) *TxQuery {
  142. this.join = append(this.join, []string{table_name, condition, "left"})
  143. return this
  144. }
  145. /**
  146. * 右连接
  147. * 2023/08/10
  148. * gz
  149. */
  150. func (this *TxQuery) RightJoin(table_name string, condition string) *TxQuery {
  151. this.join = append(this.join, []string{table_name, condition, "right"})
  152. return this
  153. }
  154. func (this *TxQuery) Data(data string) *TxQuery {
  155. this.data = append(this.data, data)
  156. return this
  157. }
  158. func (this *TxQuery) Datas(datas []string) *TxQuery {
  159. this.data = append(this.data, datas...)
  160. return this
  161. }
  162. func (this *TxQuery) Debug(debug bool) *TxQuery {
  163. this.debug = debug
  164. return this
  165. }
  166. /*
  167. * 清理上次查询
  168. */
  169. func (this *TxQuery) Clean() *TxQuery {
  170. this.title = ""
  171. this.where = this.where[0:0]
  172. this.where_or = this.where_or[0:0]
  173. this.join = this.join[0:0]
  174. this.data = this.data[0:0]
  175. this.value = this.value[0:0]
  176. this.orderby = ""
  177. this.groupby = ""
  178. this.page = 0
  179. this.page_size = 0
  180. this.save_data = this.save_data[0:0]
  181. this.upd_field = this.upd_field[0:0]
  182. this.having = ""
  183. this.alias = ""
  184. return this
  185. }
  186. // 返回表名
  187. func (this *TxQuery) GetTableName(table string) string {
  188. return getTableName(this.dbname, table)
  189. }
  190. // 构造子查询
  191. func (this *TxQuery) BuildSelectSql() (map[string]interface{}, error) {
  192. if this.dbname == "" && this.table == "" {
  193. return nil, errors.New("参数错误,没有数据表")
  194. }
  195. var table = ""
  196. if strings.Contains(this.table, "select ") {
  197. table = this.table
  198. } else {
  199. table = getTableName(this.dbname, this.table)
  200. }
  201. var sql, title string
  202. if this.title != "" {
  203. title = this.title
  204. } else {
  205. title = "*"
  206. }
  207. sql = helper.StringJoin("select ", title)
  208. if this.alias != "" {
  209. table = helper.StringJoin(table, " as ", this.alias)
  210. }
  211. sql = helper.StringJoin(sql, " from ", table)
  212. if len(this.join) > 0 {
  213. for _, joinitem := range this.join {
  214. if len(joinitem) < 2 {
  215. continue
  216. }
  217. if len(joinitem) == 3 {
  218. sql = helper.StringJoin(sql, " ", joinitem[2], " join ", getTableName(this.dbname, joinitem[0]), " on ", joinitem[1])
  219. } else { //默认左连接
  220. sql = helper.StringJoin(sql, " left join ", getTableName(this.dbname, joinitem[0]), " on ", joinitem[1])
  221. }
  222. }
  223. }
  224. if len(this.where) > 0 || len(this.where_or) > 0 {
  225. sql = helper.StringJoin(sql, " where ")
  226. }
  227. if len(this.where) > 0 {
  228. sql = helper.StringJoin(sql, " (", strings.Join(this.where, " and "), " ) ")
  229. }
  230. if len(this.where_or) > 0 {
  231. if len(this.where) > 0 {
  232. sql = helper.StringJoin(sql, " or ", strings.Join(this.where_or, " or "))
  233. } else {
  234. sql = helper.StringJoin(sql, strings.Join(this.where_or, " or "))
  235. }
  236. }
  237. if this.groupby != "" {
  238. sql = helper.StringJoin(sql, " group by ", this.groupby)
  239. }
  240. if this.having != "" {
  241. sql = helper.StringJoin(sql, " having ", this.having)
  242. }
  243. if this.orderby != "" {
  244. sql = helper.StringJoin(sql, " order by ", this.orderby)
  245. }
  246. if this.page > 0 || this.page_size > 0 {
  247. if this.page < 1 {
  248. this.page = 1
  249. }
  250. if this.page_size < 1 {
  251. this.page_size = 10
  252. }
  253. from := strconv.Itoa((this.page - 1) * this.page_size)
  254. offset := strconv.Itoa(this.page_size)
  255. if from != "" && offset != "" {
  256. sql = helper.StringJoin(sql, " limit ", from, " , ", offset)
  257. }
  258. }
  259. if this.debug {
  260. log.Println("query sql:", sql, this.value)
  261. }
  262. condition_len := 0 //所有条件数
  263. for _, ch2 := range sql {
  264. if string(ch2) == "?" {
  265. condition_len++
  266. }
  267. }
  268. if condition_len != len(this.value) {
  269. return nil, errors.New("参数错误,条件值错误")
  270. }
  271. return map[string]interface{}{
  272. "sql": sql,
  273. "value": this.value,
  274. }, nil
  275. }
  276. // 获取表格信息
  277. func (this *TxQuery) GetTableInfo(table string) (map[string]interface{}, error) {
  278. field := []string{
  279. "COLUMN_NAME", //字段名
  280. "COLUMN_DEFAULT", //默认值
  281. "DATA_TYPE", //数据类型
  282. "COLUMN_TYPE", //数据类型+长度
  283. "COLUMN_COMMENT", //备注
  284. "IS_NULLABLE", //是否为空
  285. }
  286. sql := "select `" + strings.Join(field, "`,`") + "` from information_schema.COLUMNS where table_name = ? and table_schema = ?"
  287. stmtSql, err := this.tx.Prepare(sql)
  288. if err != nil {
  289. return nil, err
  290. }
  291. list, err := StmtForQueryList(stmtSql, []interface{}{table, this.dbname})
  292. if err != nil {
  293. return nil, err
  294. }
  295. rows := make([]interface{}, 0, len(list))
  296. fieldName := make([]string, 0, len(list))
  297. for _, item := range list {
  298. info := map[string]interface{}{
  299. "name": "",
  300. "column_type": "",
  301. "is_null": true,
  302. "data_type": "",
  303. "comment": "",
  304. "default": "",
  305. }
  306. for _, k := range field {
  307. index := helper.StrFirstToUpper(k)
  308. if v, ok := item[index]; ok {
  309. switch k {
  310. case "COLUMN_NAME":
  311. info["name"] = v
  312. case "COLUMN_DEFAULT":
  313. info["default"] = v
  314. case "DATA_TYPE":
  315. info["data_type"] = v
  316. case "COLUMN_TYPE":
  317. info["column_type"] = helper.ToInt64(v)
  318. case "COLUMN_COMMENT":
  319. info["comment"] = helper.ToInt64(v)
  320. case "IS_NULLABLE":
  321. if v == "NO" {
  322. info["is_null"] = false
  323. }
  324. }
  325. }
  326. }
  327. name := helper.ToStr(info["name"])
  328. if name != "" {
  329. rows = append(rows, info)
  330. fieldName = append(fieldName, name)
  331. }
  332. }
  333. return map[string]interface{}{
  334. "field": fieldName,
  335. "list": rows,
  336. }, nil
  337. }
  338. // 拼查询sql
  339. func (this *TxQuery) QueryStmt() error {
  340. res := map[string]interface{}{}
  341. res, err = this.BuildSelectSql()
  342. if err != nil {
  343. return err
  344. }
  345. sql := helper.ToStr(res["sql"])
  346. stmt, err = this.tx.Prepare(sql + " FOR UPDATE")
  347. if err != nil {
  348. return err
  349. }
  350. this.stmt = stmt
  351. return nil
  352. }
  353. // 拼更新sql
  354. func (this *TxQuery) UpdateStmt() error {
  355. if this.dbname == "" && this.table == "" {
  356. return errors.New("参数错误,没有数据表")
  357. }
  358. if len(this.where) < 1 {
  359. return errors.New("参数错误,缺少条件")
  360. }
  361. dbName := getTableName(this.dbname, this.table)
  362. var sql string
  363. sql = helper.StringJoin("update ", dbName, " set ", strings.Join(this.data, " , "))
  364. sql = helper.StringJoin(sql, " where ", strings.Join(this.where, " and "))
  365. if this.debug {
  366. log.Println("update sql:", sql, this.value)
  367. }
  368. condition_len := 0 //所有条件数
  369. for _, ch2 := range sql {
  370. if string(ch2) == "?" {
  371. condition_len++
  372. }
  373. }
  374. if condition_len != len(this.value) {
  375. return errors.New("参数错误,条件值错误")
  376. }
  377. stmt, err = this.tx.Prepare(sql)
  378. if err != nil {
  379. return err
  380. }
  381. this.stmt = stmt
  382. return nil
  383. }
  384. // 拼批量存在更新不存在插入sql
  385. func (this *TxQuery) UpdateAllStmt() error {
  386. if this.dbname == "" && this.table == "" {
  387. return errors.New("参数错误,没有数据表")
  388. }
  389. dbName := getTableName(this.dbname, this.table)
  390. var sql string
  391. var dataSql []string //一组用到的占位字符
  392. var valSql []string //占位字符组
  393. var updSql []string //更新字段的sql
  394. var updFieldLen = len(this.upd_field) //需要更新的字段数量,为0时更新除id外添加值
  395. dataLen := len(this.save_data)
  396. if dataLen > 0 {
  397. //批量操作
  398. this.data = this.data[0:0]
  399. this.value = this.value[0:0]
  400. var dataSqlText string //占位字符组
  401. for i := 0; i < dataLen; i++ {
  402. if i == 0 {
  403. //第一组时分配变量空间
  404. fieldLen := len(this.save_data[i])
  405. this.data = make([]string, 0, fieldLen)
  406. dataSql = make([]string, 0, fieldLen)
  407. this.value = make([]interface{}, 0, fieldLen*dataLen)
  408. valSql = make([]string, 0, dataLen)
  409. switch updFieldLen {
  410. case 0:
  411. //预览创建数据的长度
  412. updSql = make([]string, 0, fieldLen)
  413. default:
  414. //按照需要更新字段数长度
  415. updSql = make([]string, 0, updFieldLen)
  416. for _, k := range this.upd_field {
  417. updSql = append(updSql, k+"=values("+k+")") //存储需要更新的字段
  418. }
  419. }
  420. for k := range this.save_data[i] {
  421. this.data = append(this.data, k) //存储添加的字段
  422. dataSql = append(dataSql, "?") //存储需要的占位符
  423. if updFieldLen == 0 && k != "id" {
  424. updSql = append(updSql, k+"=values("+k+")") //存储需要更新的字段
  425. }
  426. }
  427. dataSqlText = strings.Join(dataSql, ",") //组成每组占位字符格式
  428. }
  429. for j := 0; j < len(this.data); j++ {
  430. this.value = append(this.value, this.save_data[i][this.data[j]]) //存储值
  431. }
  432. valSql = append(valSql, "("+dataSqlText+")") //组成占位字符组
  433. }
  434. } else {
  435. //添加一条(原理同上)
  436. fieldLen := len(this.data)
  437. dataSql = make([]string, 0, fieldLen)
  438. valSql = make([]string, 0, 1)
  439. switch updFieldLen {
  440. case 0:
  441. updSql = make([]string, 0, fieldLen)
  442. default:
  443. updSql = make([]string, 0, updFieldLen)
  444. for _, k := range this.upd_field {
  445. updSql = append(updSql, k+"=values("+k+")")
  446. }
  447. }
  448. for i := 0; i < fieldLen; i++ {
  449. dataSql = append(dataSql, "?")
  450. if updFieldLen == 0 && this.data[i] != "id" {
  451. updSql = append(updSql, this.data[i]+"=values("+this.data[i]+")")
  452. }
  453. }
  454. if updFieldLen > 0 {
  455. for _, k := range this.upd_field {
  456. updSql = append(updSql, k+"=values("+k+")")
  457. }
  458. }
  459. valSql = append(valSql, "("+strings.Join(dataSql, " , ")+")")
  460. }
  461. if len(this.data) == 0 {
  462. return errors.New("参数错误,没有字段值")
  463. }
  464. if len(this.value) == 0 {
  465. return errors.New("参数错误,条件值错误")
  466. }
  467. setText := " values "
  468. if len(valSql) > 1 {
  469. setText = " value "
  470. }
  471. sql = helper.StringJoin("insert into ", dbName, " (", strings.Join(this.data, " , "), ")", setText, strings.Join(valSql, ","), " ON DUPLICATE KEY UPDATE ", strings.Join(updSql, " , "))
  472. if this.debug {
  473. log.Println("insert on duplicate key update sql:", sql, this.value)
  474. }
  475. conditionLen := 0 //所有条件数
  476. for _, ch2 := range sql {
  477. if string(ch2) == "?" {
  478. conditionLen++
  479. }
  480. }
  481. if conditionLen != len(this.value) {
  482. return errors.New("参数错误,条件值数量不匹配")
  483. }
  484. stmt, err = this.tx.Prepare(sql)
  485. if err != nil {
  486. return err
  487. }
  488. this.stmt = stmt
  489. return nil
  490. }
  491. // 拼插入sql
  492. func (this *TxQuery) CreateStmt() error {
  493. if this.dbname == "" && this.table == "" {
  494. return errors.New("参数错误,没有数据表")
  495. }
  496. dbName := getTableName(this.dbname, this.table)
  497. var sql string
  498. sql = helper.StringJoin("insert into ", dbName, " set ", strings.Join(this.data, " , "))
  499. if this.debug {
  500. log.Println("insert sql:", sql, this.value)
  501. }
  502. condition_len := 0 //所有条件数
  503. for _, ch2 := range sql {
  504. if string(ch2) == "?" {
  505. condition_len++
  506. }
  507. }
  508. if condition_len != len(this.value) {
  509. return errors.New("参数错误,条件值错误")
  510. }
  511. stmt, err = this.tx.Prepare(sql)
  512. if err != nil {
  513. return err
  514. }
  515. this.stmt = stmt
  516. return nil
  517. }
  518. // 拼批量插入sql
  519. func (this *TxQuery) CreateAllStmt() error {
  520. if this.dbname == "" && this.table == "" {
  521. return errors.New("参数错误,没有数据表")
  522. }
  523. dbName := getTableName(this.dbname, this.table)
  524. var sql string
  525. var dataSql []string //一组用到的占位字符
  526. var valSql []string //占位字符组
  527. dataLen := len(this.save_data)
  528. if dataLen > 0 {
  529. //清空字段和值
  530. this.data = this.data[0:0]
  531. this.value = this.value[0:0]
  532. var dataSqlText string //占位字符组
  533. for i := 0; i < dataLen; i++ {
  534. if i == 0 {
  535. //第一组时分配变量空间
  536. fieldLen := len(this.save_data[i])
  537. this.data = make([]string, 0, fieldLen)
  538. dataSql = make([]string, 0, fieldLen)
  539. this.value = make([]interface{}, 0, fieldLen*dataLen)
  540. valSql = make([]string, 0, dataLen)
  541. for k := range this.save_data[i] {
  542. this.data = append(this.data, k) //存储字段
  543. dataSql = append(dataSql, "?") //存储需要的占位符
  544. }
  545. dataSqlText = strings.Join(dataSql, ",") //组成每组占位字符格式
  546. }
  547. for j := 0; j < len(this.data); j++ {
  548. this.value = append(this.value, this.save_data[i][this.data[j]]) //存储值
  549. }
  550. valSql = append(valSql, "("+dataSqlText+")") //组成占位字符组
  551. }
  552. } else {
  553. //添加一条(原理同上)
  554. fieldLen := len(this.data)
  555. dataSql = make([]string, 0, fieldLen)
  556. for i := 0; i < fieldLen; i++ {
  557. dataSql = append(dataSql, "?")
  558. }
  559. valSql = make([]string, 0, 1)
  560. valSql = append(valSql, "("+strings.Join(dataSql, " , ")+")")
  561. }
  562. if len(this.data) == 0 {
  563. return errors.New("参数错误,字段名错误")
  564. }
  565. if len(this.value) == 0 {
  566. return errors.New("参数错误,条件值错误")
  567. }
  568. //通过sql关键字优化批量操作和单个操作效率
  569. setText := " values "
  570. if len(valSql) > 1 {
  571. setText = " value "
  572. }
  573. sql = helper.StringJoin("insert into ", dbName, " (", strings.Join(this.data, " , "), ")", setText, strings.Join(valSql, ","))
  574. if len(this.value) == 0 {
  575. return errors.New("参数错误,条件值错误")
  576. }
  577. if this.debug {
  578. log.Println("insert sql:", sql, this.value)
  579. }
  580. conditionLen := 0 //所有条件数
  581. for _, ch2 := range sql {
  582. if string(ch2) == "?" {
  583. conditionLen++
  584. }
  585. }
  586. if conditionLen != len(this.value) {
  587. return errors.New("参数错误,条件值数量不匹配")
  588. }
  589. stmt, err = this.tx.Prepare(sql)
  590. if err != nil {
  591. return err
  592. }
  593. this.stmt = stmt
  594. return nil
  595. }
  596. // 拼删除sql
  597. func (this *TxQuery) DeleteStmt() error {
  598. if this.dbname == "" && this.table == "" {
  599. return errors.New("参数错误,没有数据表")
  600. }
  601. if len(this.where) < 1 {
  602. return errors.New("参数错误,缺少条件")
  603. }
  604. dbName := getTableName(this.dbname, this.table)
  605. var sql string
  606. sql = helper.StringJoin("delete from ", dbName, " where ", strings.Join(this.where, " and "))
  607. if this.page_size > 0 {
  608. sql = helper.StringJoin(sql, " limit ", strconv.Itoa(this.page_size))
  609. }
  610. if this.debug {
  611. log.Println("delete sql:", sql, this.value)
  612. }
  613. condition_len := 0 //所有条件数
  614. for _, ch2 := range sql {
  615. if string(ch2) == "?" {
  616. condition_len++
  617. }
  618. }
  619. if condition_len != len(this.value) {
  620. return errors.New("参数错误,条件值错误")
  621. }
  622. stmt, err = this.tx.Prepare(sql)
  623. if err != nil {
  624. return err
  625. }
  626. this.stmt = stmt
  627. return nil
  628. }
  629. /**
  630. * 执行查询列表
  631. * return list error
  632. */
  633. func (this *TxQuery) Select() ([]map[string]string, error) {
  634. err := this.QueryStmt()
  635. if err != nil {
  636. return []map[string]string{}, err
  637. }
  638. if this.stmt == nil {
  639. return []map[string]string{}, errors.New("缺少必要参数")
  640. }
  641. return StmtForQueryList(this.stmt, this.value)
  642. }
  643. /**
  644. * 执行查询一条数据
  645. * return row error
  646. */
  647. func (this *TxQuery) Find() (map[string]string, error) {
  648. this.page = 1
  649. this.page_size = 1
  650. err := this.QueryStmt()
  651. if err != nil {
  652. return map[string]string{}, err
  653. }
  654. if this.stmt == nil {
  655. return nil, errors.New("缺少必要参数")
  656. }
  657. return StmtForQueryRow(this.stmt, this.value)
  658. }
  659. /**
  660. * 执行更新
  661. * return is_updated error
  662. */
  663. func (this *TxQuery) Update() (int64, error) {
  664. err := this.UpdateStmt()
  665. if err != nil {
  666. return 0, err
  667. }
  668. return StmtForUpdateExec(this.stmt, this.value)
  669. }
  670. // UpdateAll 批量更新(根据唯一键判断存在则更新,不存在则创建)
  671. func (this *TxQuery) UpdateAll() (int64, error) {
  672. err := this.UpdateAllStmt()
  673. if err != nil {
  674. return 0, err
  675. }
  676. return StmtForUpdateExec(this.stmt, this.value)
  677. }
  678. /**
  679. * 执行删除
  680. * return is_delete error
  681. */
  682. func (this *TxQuery) Delete() (int64, error) {
  683. err := this.DeleteStmt()
  684. if err != nil {
  685. return 0, err
  686. }
  687. return StmtForUpdateExec(this.stmt, this.value)
  688. }
  689. /**
  690. * 执行写入
  691. * return is_insert error
  692. */
  693. func (this *TxQuery) Create() (int64, error) {
  694. err := this.CreateStmt()
  695. if err != nil {
  696. return 0, err
  697. }
  698. return StmtForInsertExec(this.stmt, this.value)
  699. }
  700. /**
  701. * 执行批量写入
  702. * return is_insert error
  703. */
  704. func (this *TxQuery) CreateAll() (int64, error) {
  705. err := this.CreateAllStmt()
  706. if err != nil {
  707. return 0, err
  708. }
  709. return StmtForInsertExec(this.stmt, this.value)
  710. }
  711. /**
  712. * 提交
  713. */
  714. func (this *TxQuery) Commit() error {
  715. return this.tx.Commit()
  716. }
  717. /**
  718. * 回滚
  719. */
  720. func (this *TxQuery) Rollback() error {
  721. return this.tx.Rollback()
  722. }