query.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package db
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. type Join struct {
  7. TableName string
  8. As string
  9. On []string
  10. }
  11. type Select struct {
  12. TableName string
  13. Select map[string]string
  14. InnerJoin []Join
  15. LeftJoin []Join
  16. Where []string
  17. GroupBy string
  18. Having []string
  19. OrderBy string
  20. Limit int64
  21. Offset int64
  22. params map[string]interface{}
  23. }
  24. func (s *Select) Param(value interface{}) string {
  25. if s.params == nil {
  26. s.params = make(map[string]interface{})
  27. }
  28. name := fmt.Sprintf("p%d", len(s.params))
  29. s.params[name] = value
  30. return fmt.Sprintf("{{%s}}", name)
  31. }
  32. func (s Select) Query() (string, map[string]interface{}) {
  33. query := strings.Builder{}
  34. query.WriteString("SELECT ")
  35. if len(s.Select) == 0 {
  36. query.WriteString("*")
  37. } else {
  38. dot := ""
  39. for k, v := range s.Select {
  40. query.WriteString(fmt.Sprintf("%s%s AS `%s`", dot, v, k))
  41. dot = ", "
  42. }
  43. }
  44. query.WriteString(" FROM ")
  45. if s.TableName[0] != '`' && s.TableName[len(s.TableName)-1] != '`' && !strings.Contains(s.TableName, " ") {
  46. query.WriteString(fmt.Sprintf("`%s`", s.TableName))
  47. } else {
  48. query.WriteString(s.TableName)
  49. }
  50. for _, join := range []struct {
  51. Type string
  52. Data []Join
  53. }{{"INNER JOIN", s.InnerJoin}, {"LEFT JOIN", s.LeftJoin}} {
  54. for _, v := range join.Data {
  55. as := ""
  56. if v.As != "" {
  57. as = fmt.Sprintf("AS `%s`", v.As)
  58. }
  59. table := v.TableName
  60. if !strings.Contains(table, " ") {
  61. table = fmt.Sprintf("`%s`", table)
  62. }
  63. query.WriteString(fmt.Sprintf(" %s %s %s ON %s", join.Type, table, as, strings.Join(v.On, " AND ")))
  64. }
  65. }
  66. if len(s.Where) != 0 {
  67. query.WriteString(" WHERE (")
  68. query.WriteString(strings.Join(s.Where, ") AND ("))
  69. query.WriteString(")")
  70. }
  71. if s.GroupBy != "" {
  72. query.WriteString(" GROUP BY ")
  73. query.WriteString(s.GroupBy)
  74. }
  75. if len(s.Having) != 0 {
  76. query.WriteString(" HAVING ")
  77. query.WriteString(strings.Join(s.Having, " AND "))
  78. }
  79. if s.OrderBy != "" {
  80. query.WriteString(" ORDER BY ")
  81. query.WriteString(s.OrderBy)
  82. }
  83. if s.Limit != 0 {
  84. query.WriteString(fmt.Sprintf(" LIMIT %d", s.Limit))
  85. if s.Offset != 0 {
  86. query.WriteString(fmt.Sprintf(" OFFSET %d", s.Offset))
  87. }
  88. }
  89. if s.params == nil {
  90. s.params = make(map[string]interface{})
  91. }
  92. return query.String(), s.params
  93. }