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

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