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

395 lines
7.7 KiB

  1. package dbquery
  2. import (
  3. "database/sql"
  4. "errors"
  5. "strconv"
  6. "strings"
  7. "git.tetele.net/tgo/helper"
  8. )
  9. var stmt *sql.Stmt
  10. var err error
  11. type Query struct {
  12. dbname string
  13. table string
  14. alias string
  15. title string
  16. where []string
  17. where_or []string
  18. join [][]string //[["tablea as a","a.id=b.id","left"]]
  19. data []string
  20. value []interface{}
  21. orderby string
  22. page int
  23. page_size int
  24. stmt *sql.Stmt
  25. }
  26. func (this *Query) Db(dbname string) *Query {
  27. this.dbname = dbname
  28. return this
  29. }
  30. func (this *Query) Table(tablename string) *Query {
  31. this.table = tablename
  32. return this
  33. }
  34. func (this *Query) Alias(tablename string) *Query {
  35. this.alias = tablename
  36. return this
  37. }
  38. func (this *Query) Title(title string) *Query {
  39. this.title = title
  40. return this
  41. }
  42. func (this *Query) Page(page int) *Query {
  43. this.page = page
  44. return this
  45. }
  46. func (this *Query) PageSize(page_num int) *Query {
  47. this.page_size = page_num
  48. return this
  49. }
  50. func (this *Query) Orderby(orderby string) *Query {
  51. this.orderby = orderby
  52. return this
  53. }
  54. func (this *Query) Where(where string) *Query {
  55. this.where = append(this.where, where)
  56. return this
  57. }
  58. func (this *Query) WhereOr(where string) *Query {
  59. this.where_or = append(this.where_or, where)
  60. return this
  61. }
  62. func (this *Query) Value(value interface{}) *Query {
  63. this.value = append(this.value, value)
  64. return this
  65. }
  66. func (this *Query) Values(values []interface{}) *Query {
  67. this.value = append(this.value, values...)
  68. return this
  69. }
  70. func (this *Query) Join(join []string) *Query {
  71. this.join = append(this.join, join)
  72. return this
  73. }
  74. func (this *Query) Data(data string) *Query {
  75. this.data = append(this.data, data)
  76. return this
  77. }
  78. func (this *Query) Datas(datas []string) *Query {
  79. this.data = append(this.data, datas...)
  80. return this
  81. }
  82. // func (this *Query) Insert(where string) *Query {
  83. // this.insert = append(this.insert, where)
  84. // return this
  85. // }
  86. // 拼查询sql
  87. func (this *Query) QueryStmt() error {
  88. if this.dbname == "" && this.table == "" {
  89. return errors.New("参数错误,没有数据表")
  90. }
  91. // if len(this.where)+len(this.where_or) < len(this.value) {
  92. // return errors.New("参数错误,条件值错误")
  93. // }
  94. table := getTableName(this.dbname, this.table)
  95. // var err error
  96. var sql, title string
  97. if this.title != "" {
  98. title = this.title
  99. } else {
  100. title = "*"
  101. }
  102. sql = helper.StringJoin("select ", title)
  103. if this.alias != "" {
  104. table = helper.StringJoin(table, " as ", this.alias)
  105. }
  106. sql = helper.StringJoin(sql, " from ", table)
  107. if len(this.join) > 0 {
  108. for _, joinitem := range this.join {
  109. if len(joinitem) < 2 {
  110. continue
  111. }
  112. if len(joinitem) == 3 {
  113. sql = helper.StringJoin(sql, " ", joinitem[2], " join ", getTableName(this.dbname, joinitem[0]), " on ", joinitem[1])
  114. } else { //默认左连接
  115. sql = helper.StringJoin(sql, " left join ", getTableName(this.dbname, joinitem[0]), " on ", joinitem[1])
  116. }
  117. }
  118. }
  119. if len(this.where) > 0 || len(this.where_or) > 0 {
  120. sql = helper.StringJoin(sql, " where ")
  121. }
  122. if len(this.where) > 0 {
  123. sql = helper.StringJoin(sql, " (", strings.Join(this.where, " and "), " ) ")
  124. }
  125. if len(this.where_or) > 0 {
  126. if len(this.where) > 0 {
  127. sql = helper.StringJoin(sql, " or ", strings.Join(this.where_or, " or "))
  128. } else {
  129. sql = helper.StringJoin(sql, strings.Join(this.where_or, " or "))
  130. }
  131. }
  132. if this.orderby != "" {
  133. sql = helper.StringJoin(sql, " order by ", this.orderby)
  134. }
  135. if this.page > 0 || this.page_size > 0 {
  136. if this.page < 0 {
  137. this.page = 0
  138. }
  139. if this.page_size < 1 {
  140. this.page_size = 10
  141. }
  142. from := strconv.Itoa(this.page * this.page_size)
  143. offset := strconv.Itoa(this.page_size)
  144. if from != "" && offset != "" {
  145. sql = helper.StringJoin(sql, " limit ", from, " , ", offset)
  146. }
  147. }
  148. // log.Println(sql)
  149. condition_len := 0 //所有条件数
  150. for _, ch2 := range sql {
  151. if string(ch2) == "?" {
  152. condition_len++
  153. }
  154. }
  155. if condition_len != len(this.value) {
  156. return errors.New("参数错误,条件值错误")
  157. }
  158. stmt, err = DB.Prepare(sql)
  159. if err != nil {
  160. return err
  161. }
  162. this.stmt = stmt
  163. return nil
  164. }
  165. // 拼更新sql
  166. func (this *Query) UpdateStmt() error {
  167. if this.dbname == "" && this.table == "" {
  168. return errors.New("参数错误,没有数据表")
  169. }
  170. if len(this.where) < 1 {
  171. return errors.New("参数错误,缺少条件")
  172. }
  173. dbName := getTableName(this.dbname, this.table)
  174. // var stmt *sql.Stmt
  175. // var err error
  176. var sql string
  177. sql = helper.StringJoin("update ", dbName, " set ", strings.Join(this.data, " , "))
  178. sql = helper.StringJoin(sql, " where ", strings.Join(this.where, " and "))
  179. condition_len := 0 //所有条件数
  180. for _, ch2 := range sql {
  181. if string(ch2) == "?" {
  182. condition_len++
  183. }
  184. }
  185. if condition_len != len(this.value) {
  186. return errors.New("参数错误,条件值错误")
  187. }
  188. stmt, err = DB.Prepare(sql)
  189. if err != nil {
  190. return err
  191. }
  192. this.stmt = stmt
  193. return nil
  194. }
  195. // 拼插入sql
  196. func (this *Query) CreateStmt() error {
  197. if this.dbname == "" && this.table == "" {
  198. return errors.New("参数错误,没有数据表")
  199. }
  200. dbName := getTableName(this.dbname, this.table)
  201. // var stmt *sql.Stmt
  202. // var err error
  203. var sql string
  204. sql = helper.StringJoin("insert into ", dbName, " set ", strings.Join(this.data, " , "))
  205. condition_len := 0 //所有条件数
  206. for _, ch2 := range sql {
  207. if string(ch2) == "?" {
  208. condition_len++
  209. }
  210. }
  211. if condition_len != len(this.value) {
  212. return errors.New("参数错误,条件值错误")
  213. }
  214. stmt, err = DB.Prepare(sql)
  215. if err != nil {
  216. return err
  217. }
  218. this.stmt = stmt
  219. return nil
  220. }
  221. // 拼删除sql
  222. func (this *Query) DeleteStmt() error {
  223. if this.dbname == "" && this.table == "" {
  224. return errors.New("参数错误,没有数据表")
  225. }
  226. if len(this.where) < 1 {
  227. return errors.New("参数错误,缺少条件")
  228. }
  229. // if len(this.where) != len(this.value) {
  230. // return errors.New("参数错误,条件值错误")
  231. // }
  232. dbName := getTableName(this.dbname, this.table)
  233. // var stmt *sql.Stmt
  234. // var err error
  235. var sql string
  236. sql = helper.StringJoin("delete from ", dbName, " where ", strings.Join(this.where, " and "))
  237. if this.page_size > 0 {
  238. sql = helper.StringJoin(sql, " limit ", strconv.Itoa(this.page_size))
  239. }
  240. condition_len := 0 //所有条件数
  241. for _, ch2 := range sql {
  242. if string(ch2) == "?" {
  243. condition_len++
  244. }
  245. }
  246. if condition_len != len(this.value) {
  247. return errors.New("参数错误,条件值错误")
  248. }
  249. stmt, err = DB.Prepare(sql)
  250. if err != nil {
  251. return err
  252. }
  253. this.stmt = stmt
  254. return nil
  255. }
  256. /**
  257. * 执行查询列表
  258. * return list error
  259. */
  260. func (this *Query) Select() ([]map[string]string, error) {
  261. err := this.QueryStmt()
  262. if err != nil {
  263. return []map[string]string{}, err
  264. }
  265. if this.stmt == nil {
  266. return []map[string]string{}, errors.New("缺少必要参数")
  267. }
  268. return StmtForQueryList(this.stmt, this.value)
  269. }
  270. /**
  271. * 执行查询一条数据
  272. * return row error
  273. */
  274. func (this *Query) Find() (map[string]string, error) {
  275. err := this.QueryStmt()
  276. if err != nil {
  277. return map[string]string{}, err
  278. }
  279. if this.stmt == nil {
  280. return nil, errors.New("缺少必要参数")
  281. }
  282. return StmtForQueryRow(this.stmt, this.value)
  283. }
  284. /**
  285. * 执行更新
  286. * return is_updated error
  287. */
  288. func (this *Query) Update() (int64, error) {
  289. err := this.UpdateStmt()
  290. if err != nil {
  291. return 0, err
  292. }
  293. return StmtForUpdateExec(this.stmt, this.value)
  294. }
  295. /**
  296. * 执行删除
  297. * return is_delete error
  298. */
  299. func (this *Query) Delete() (int64, error) {
  300. err := this.DeleteStmt()
  301. if err != nil {
  302. return 0, err
  303. }
  304. return StmtForUpdateExec(this.stmt, this.value)
  305. }
  306. /**
  307. * 执行写入
  308. * return is_insert error
  309. */
  310. func (this *Query) Create() (int64, error) {
  311. err := this.CreateStmt()
  312. if err != nil {
  313. return 0, err
  314. }
  315. return StmtForInsertExec(this.stmt, this.value)
  316. }