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

492 lines
9.4 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. orderby string
  24. groupby string
  25. page int
  26. page_size int
  27. stmt *sql.Stmt
  28. conn *sql.DB
  29. tx *sql.Tx
  30. debug bool
  31. }
  32. func NewTxQuery(t ...string) *TxQuery {
  33. var conn_type *sql.DB = DB
  34. if len(t) > 0 {
  35. switch t[0] {
  36. case "mysql":
  37. conn_type = DB
  38. case "mssql": //sql server
  39. conn_type = MSDB_CONN
  40. }
  41. }
  42. tx, err := conn_type.Begin()
  43. if err != nil {
  44. log.Println("start tx begin error", err)
  45. }
  46. return &TxQuery{
  47. conn: conn_type,
  48. tx: tx,
  49. }
  50. }
  51. func (this *TxQuery) Conn(conn *sql.DB) *TxQuery {
  52. this.conn = conn
  53. return this
  54. }
  55. func (this *TxQuery) Db(dbname string) *TxQuery {
  56. this.dbname = dbname
  57. return this
  58. }
  59. func (this *TxQuery) Table(tablename string) *TxQuery {
  60. this.table = tablename
  61. return this
  62. }
  63. func (this *TxQuery) Alias(tablename string) *TxQuery {
  64. this.alias = tablename
  65. return this
  66. }
  67. func (this *TxQuery) Title(title string) *TxQuery {
  68. this.title = title
  69. return this
  70. }
  71. func (this *TxQuery) Page(page int) *TxQuery {
  72. this.page = page
  73. return this
  74. }
  75. func (this *TxQuery) PageSize(page_num int) *TxQuery {
  76. this.page_size = page_num
  77. return this
  78. }
  79. func (this *TxQuery) Orderby(orderby string) *TxQuery {
  80. this.orderby = orderby
  81. return this
  82. }
  83. func (this *TxQuery) Groupby(groupby string) *TxQuery {
  84. this.groupby = groupby
  85. return this
  86. }
  87. func (this *TxQuery) Where(where string) *TxQuery {
  88. this.where = append(this.where, where)
  89. return this
  90. }
  91. func (this *TxQuery) Wheres(wheres []string) *TxQuery {
  92. if len(wheres) > 0 {
  93. this.where = append(this.where, wheres...)
  94. }
  95. return this
  96. }
  97. func (this *TxQuery) WhereOr(where string) *TxQuery {
  98. this.where_or = append(this.where_or, where)
  99. return this
  100. }
  101. func (this *TxQuery) Value(value interface{}) *TxQuery {
  102. this.value = append(this.value, value)
  103. return this
  104. }
  105. func (this *TxQuery) Values(values []interface{}) *TxQuery {
  106. this.value = append(this.value, values...)
  107. return this
  108. }
  109. func (this *TxQuery) Join(join []string) *TxQuery {
  110. this.join = append(this.join, join)
  111. return this
  112. }
  113. func (this *TxQuery) Data(data string) *TxQuery {
  114. this.data = append(this.data, data)
  115. return this
  116. }
  117. func (this *TxQuery) Datas(datas []string) *TxQuery {
  118. this.data = append(this.data, datas...)
  119. return this
  120. }
  121. func (this *TxQuery) Debug(debug bool) *TxQuery {
  122. this.debug = debug
  123. return this
  124. }
  125. /*
  126. * 清理上次查询
  127. */
  128. func (this *TxQuery) Clean() *TxQuery {
  129. this.title = ""
  130. this.where = this.where[0:0]
  131. this.where_or = this.where_or[0:0]
  132. this.join = this.join[0:0]
  133. this.data = this.data[0:0]
  134. this.value = this.value[0:0]
  135. this.orderby = ""
  136. this.groupby = ""
  137. this.page = 0
  138. this.page_size = 0
  139. return this
  140. }
  141. //构造子查询
  142. func (this *TxQuery) BuildSelectSql() (map[string]interface{}, error) {
  143. if this.dbname == "" && this.table == "" {
  144. return nil, errors.New("参数错误,没有数据表")
  145. }
  146. var table = ""
  147. if strings.Contains(this.table, "select ") {
  148. table = this.table
  149. } else {
  150. table = getTableName(this.dbname, this.table)
  151. }
  152. var sql, title string
  153. if this.title != "" {
  154. title = this.title
  155. } else {
  156. title = "*"
  157. }
  158. sql = helper.StringJoin("select ", title)
  159. if this.alias != "" {
  160. table = helper.StringJoin(table, " as ", this.alias)
  161. }
  162. sql = helper.StringJoin(sql, " from ", table)
  163. if len(this.join) > 0 {
  164. for _, joinitem := range this.join {
  165. if len(joinitem) < 2 {
  166. continue
  167. }
  168. if len(joinitem) == 3 {
  169. sql = helper.StringJoin(sql, " ", joinitem[2], " join ", getTableName(this.dbname, joinitem[0]), " on ", joinitem[1])
  170. } else { //默认左连接
  171. sql = helper.StringJoin(sql, " left join ", getTableName(this.dbname, joinitem[0]), " on ", joinitem[1])
  172. }
  173. }
  174. }
  175. if len(this.where) > 0 || len(this.where_or) > 0 {
  176. sql = helper.StringJoin(sql, " where ")
  177. }
  178. if len(this.where) > 0 {
  179. sql = helper.StringJoin(sql, " (", strings.Join(this.where, " and "), " ) ")
  180. }
  181. if len(this.where_or) > 0 {
  182. if len(this.where) > 0 {
  183. sql = helper.StringJoin(sql, " or ", strings.Join(this.where_or, " or "))
  184. } else {
  185. sql = helper.StringJoin(sql, strings.Join(this.where_or, " or "))
  186. }
  187. }
  188. if this.groupby != "" {
  189. sql = helper.StringJoin(sql, " group by ", this.groupby)
  190. }
  191. if this.orderby != "" {
  192. sql = helper.StringJoin(sql, " order by ", this.orderby)
  193. }
  194. if this.page > 0 || this.page_size > 0 {
  195. if this.page < 1 {
  196. this.page = 1
  197. }
  198. if this.page_size < 1 {
  199. this.page_size = 10
  200. }
  201. from := strconv.Itoa((this.page - 1) * this.page_size)
  202. offset := strconv.Itoa(this.page_size)
  203. if from != "" && offset != "" {
  204. sql = helper.StringJoin(sql, " limit ", from, " , ", offset)
  205. }
  206. }
  207. if this.debug {
  208. log.Println("query sql:", sql, this.value)
  209. }
  210. condition_len := 0 //所有条件数
  211. for _, ch2 := range sql {
  212. if string(ch2) == "?" {
  213. condition_len++
  214. }
  215. }
  216. if condition_len != len(this.value) {
  217. return nil, errors.New("参数错误,条件值错误")
  218. }
  219. return map[string]interface{}{
  220. "sql": sql,
  221. "value": this.value,
  222. }, nil
  223. }
  224. // 拼查询sql
  225. func (this *TxQuery) QueryStmt() error {
  226. res := map[string]interface{}{}
  227. res, err = this.BuildSelectSql()
  228. if err != nil {
  229. return err
  230. }
  231. sql := helper.ToStr(res["sql"])
  232. stmt, err = this.tx.Prepare(sql + " FOR UPDATE")
  233. if err != nil {
  234. return err
  235. }
  236. this.stmt = stmt
  237. return nil
  238. }
  239. // 拼更新sql
  240. func (this *TxQuery) UpdateStmt() error {
  241. if this.dbname == "" && this.table == "" {
  242. return errors.New("参数错误,没有数据表")
  243. }
  244. if len(this.where) < 1 {
  245. return errors.New("参数错误,缺少条件")
  246. }
  247. dbName := getTableName(this.dbname, this.table)
  248. var sql string
  249. sql = helper.StringJoin("update ", dbName, " set ", strings.Join(this.data, " , "))
  250. sql = helper.StringJoin(sql, " where ", strings.Join(this.where, " and "))
  251. if this.debug {
  252. log.Println("update sql:", sql, this.value)
  253. }
  254. condition_len := 0 //所有条件数
  255. for _, ch2 := range sql {
  256. if string(ch2) == "?" {
  257. condition_len++
  258. }
  259. }
  260. if condition_len != len(this.value) {
  261. return errors.New("参数错误,条件值错误")
  262. }
  263. stmt, err = this.tx.Prepare(sql)
  264. if err != nil {
  265. return err
  266. }
  267. this.stmt = stmt
  268. return nil
  269. }
  270. // 拼插入sql
  271. func (this *TxQuery) CreateStmt() error {
  272. if this.dbname == "" && this.table == "" {
  273. return errors.New("参数错误,没有数据表")
  274. }
  275. dbName := getTableName(this.dbname, this.table)
  276. var sql string
  277. sql = helper.StringJoin("insert into ", dbName, " set ", strings.Join(this.data, " , "))
  278. if this.debug {
  279. log.Println("insert sql:", sql, this.value)
  280. }
  281. condition_len := 0 //所有条件数
  282. for _, ch2 := range sql {
  283. if string(ch2) == "?" {
  284. condition_len++
  285. }
  286. }
  287. if condition_len != len(this.value) {
  288. return errors.New("参数错误,条件值错误")
  289. }
  290. stmt, err = this.tx.Prepare(sql)
  291. if err != nil {
  292. return err
  293. }
  294. this.stmt = stmt
  295. return nil
  296. }
  297. // 拼删除sql
  298. func (this *TxQuery) DeleteStmt() error {
  299. if this.dbname == "" && this.table == "" {
  300. return errors.New("参数错误,没有数据表")
  301. }
  302. if len(this.where) < 1 {
  303. return errors.New("参数错误,缺少条件")
  304. }
  305. dbName := getTableName(this.dbname, this.table)
  306. var sql string
  307. sql = helper.StringJoin("delete from ", dbName, " where ", strings.Join(this.where, " and "))
  308. if this.page_size > 0 {
  309. sql = helper.StringJoin(sql, " limit ", strconv.Itoa(this.page_size))
  310. }
  311. if this.debug {
  312. log.Println("delete sql:", sql, this.value)
  313. }
  314. condition_len := 0 //所有条件数
  315. for _, ch2 := range sql {
  316. if string(ch2) == "?" {
  317. condition_len++
  318. }
  319. }
  320. if condition_len != len(this.value) {
  321. return errors.New("参数错误,条件值错误")
  322. }
  323. stmt, err = this.tx.Prepare(sql)
  324. if err != nil {
  325. return err
  326. }
  327. this.stmt = stmt
  328. return nil
  329. }
  330. /**
  331. * 执行查询列表
  332. * return list error
  333. */
  334. func (this *TxQuery) Select() ([]map[string]string, error) {
  335. err := this.QueryStmt()
  336. if err != nil {
  337. return []map[string]string{}, err
  338. }
  339. if this.stmt == nil {
  340. return []map[string]string{}, errors.New("缺少必要参数")
  341. }
  342. return StmtForQueryList(this.stmt, this.value)
  343. }
  344. /**
  345. * 执行查询一条数据
  346. * return row error
  347. */
  348. func (this *TxQuery) Find() (map[string]string, error) {
  349. this.page = 1
  350. this.page_size = 1
  351. err := this.QueryStmt()
  352. if err != nil {
  353. return map[string]string{}, err
  354. }
  355. if this.stmt == nil {
  356. return nil, errors.New("缺少必要参数")
  357. }
  358. return StmtForQueryRow(this.stmt, this.value)
  359. }
  360. /**
  361. * 执行更新
  362. * return is_updated error
  363. */
  364. func (this *TxQuery) Update() (int64, error) {
  365. err := this.UpdateStmt()
  366. if err != nil {
  367. return 0, err
  368. }
  369. return StmtForUpdateExec(this.stmt, this.value)
  370. }
  371. /**
  372. * 执行删除
  373. * return is_delete error
  374. */
  375. func (this *TxQuery) Delete() (int64, error) {
  376. err := this.DeleteStmt()
  377. if err != nil {
  378. return 0, err
  379. }
  380. return StmtForUpdateExec(this.stmt, this.value)
  381. }
  382. /**
  383. * 执行写入
  384. * return is_insert error
  385. */
  386. func (this *TxQuery) Create() (int64, error) {
  387. err := this.CreateStmt()
  388. if err != nil {
  389. return 0, err
  390. }
  391. return StmtForInsertExec(this.stmt, this.value)
  392. }
  393. /**
  394. * 提交
  395. */
  396. func (this *TxQuery) Commit() error {
  397. return this.tx.Commit()
  398. }
  399. /**
  400. * 回滚
  401. */
  402. func (this *TxQuery) Rollback() error {
  403. return this.tx.Rollback()
  404. }