9013f5c6 by astaxie

Merge pull request #808 from ZhengYang/develop

more complete support for sql language
2 parents fb0cc558 29b7ff84
...@@ -19,15 +19,22 @@ import "errors" ...@@ -19,15 +19,22 @@ import "errors"
19 type QueryBuilder interface { 19 type QueryBuilder interface {
20 Select(fields ...string) QueryBuilder 20 Select(fields ...string) QueryBuilder
21 From(tables ...string) QueryBuilder 21 From(tables ...string) QueryBuilder
22 Where(cond string) QueryBuilder
23 LimitOffset(limit int, offset int) QueryBuilder
24 InnerJoin(table string) QueryBuilder 22 InnerJoin(table string) QueryBuilder
25 LeftJoin(table string) QueryBuilder 23 LeftJoin(table string) QueryBuilder
24 RightJoin(table string) QueryBuilder
26 On(cond string) QueryBuilder 25 On(cond string) QueryBuilder
26 Where(cond string) QueryBuilder
27 And(cond string) QueryBuilder 27 And(cond string) QueryBuilder
28 Or(cond string) QueryBuilder 28 Or(cond string) QueryBuilder
29 In(vals ...string) QueryBuilder 29 In(vals ...string) QueryBuilder
30 Subquery(query string, rename string) string 30 OrderBy(fields ...string) QueryBuilder
31 Asc() QueryBuilder
32 Desc() QueryBuilder
33 Limit(limit int) QueryBuilder
34 Offset(offset int) QueryBuilder
35 GroupBy(fields ...string) QueryBuilder
36 Having(cond string) QueryBuilder
37 Subquery(sub string, alias string) string
31 String() string 38 String() string
32 } 39 }
33 40
......
...@@ -16,70 +16,106 @@ package orm ...@@ -16,70 +16,106 @@ package orm
16 16
17 import ( 17 import (
18 "fmt" 18 "fmt"
19 "strconv"
19 "strings" 20 "strings"
20 ) 21 )
21 22
22 type MySQLQueryBuilder struct { 23 type MySQLQueryBuilder struct {
23 QueryString []string 24 QueryTokens []string
24 } 25 }
25 26
26 func (qw *MySQLQueryBuilder) Select(fields ...string) QueryBuilder { 27 func (qb *MySQLQueryBuilder) Select(fields ...string) QueryBuilder {
27 segment := fmt.Sprintf("SELECT %s", strings.Join(fields, ", ")) 28 segment := fmt.Sprintf("SELECT %s", strings.Join(fields, ", "))
28 qw.QueryString = append(qw.QueryString, segment) 29 qb.QueryTokens = append(qb.QueryTokens, segment)
29 return qw 30 return qb
30 } 31 }
31 32
32 func (qw *MySQLQueryBuilder) From(tables ...string) QueryBuilder { 33 func (qb *MySQLQueryBuilder) From(tables ...string) QueryBuilder {
33 segment := fmt.Sprintf("FROM %s", strings.Join(tables, ", ")) 34 segment := fmt.Sprintf("FROM %s", strings.Join(tables, ", "))
34 qw.QueryString = append(qw.QueryString, segment) 35 qb.QueryTokens = append(qb.QueryTokens, segment)
35 return qw 36 return qb
36 } 37 }
37 38
38 func (qw *MySQLQueryBuilder) Where(cond string) QueryBuilder { 39 func (qb *MySQLQueryBuilder) InnerJoin(table string) QueryBuilder {
39 qw.QueryString = append(qw.QueryString, "WHERE "+cond) 40 qb.QueryTokens = append(qb.QueryTokens, "INNER JOIN "+table)
40 return qw 41 return qb
41 } 42 }
42 43
43 func (qw *MySQLQueryBuilder) LimitOffset(limit int, offset int) QueryBuilder { 44 func (qb *MySQLQueryBuilder) LeftJoin(table string) QueryBuilder {
44 qw.QueryString = append(qw.QueryString, fmt.Sprintf("LIMIT %d OFFSET %d", limit, offset)) 45 qb.QueryTokens = append(qb.QueryTokens, "LEFT JOIN "+table)
45 return qw 46 return qb
46 } 47 }
47 48
48 func (qw *MySQLQueryBuilder) InnerJoin(table string) QueryBuilder { 49 func (qb *MySQLQueryBuilder) RightJoin(table string) QueryBuilder {
49 qw.QueryString = append(qw.QueryString, "INNER JOIN "+table) 50 qb.QueryTokens = append(qb.QueryTokens, "RIGHT JOIN "+table)
50 return qw 51 return qb
51 } 52 }
52 53
53 func (qw *MySQLQueryBuilder) LeftJoin(table string) QueryBuilder { 54 func (qb *MySQLQueryBuilder) On(cond string) QueryBuilder {
54 qw.QueryString = append(qw.QueryString, "LEFT JOIN "+table) 55 qb.QueryTokens = append(qb.QueryTokens, "ON "+cond)
55 return qw 56 return qb
56 } 57 }
57 58
58 func (qw *MySQLQueryBuilder) On(cond string) QueryBuilder { 59 func (qb *MySQLQueryBuilder) Where(cond string) QueryBuilder {
59 qw.QueryString = append(qw.QueryString, "ON "+cond) 60 qb.QueryTokens = append(qb.QueryTokens, "WHERE "+cond)
60 return qw 61 return qb
61 } 62 }
62 63
63 func (qw *MySQLQueryBuilder) And(cond string) QueryBuilder { 64 func (qb *MySQLQueryBuilder) And(cond string) QueryBuilder {
64 qw.QueryString = append(qw.QueryString, "AND "+cond) 65 qb.QueryTokens = append(qb.QueryTokens, "AND "+cond)
65 return qw 66 return qb
66 } 67 }
67 68
68 func (qw *MySQLQueryBuilder) Or(cond string) QueryBuilder { 69 func (qb *MySQLQueryBuilder) Or(cond string) QueryBuilder {
69 qw.QueryString = append(qw.QueryString, "OR "+cond) 70 qb.QueryTokens = append(qb.QueryTokens, "OR "+cond)
70 return qw 71 return qb
71 } 72 }
72 73
73 func (qw *MySQLQueryBuilder) In(vals ...string) QueryBuilder { 74 func (qb *MySQLQueryBuilder) In(vals ...string) QueryBuilder {
74 segment := fmt.Sprintf("IN (%s)", strings.Join(vals, ", ")) 75 segment := fmt.Sprintf("IN (%s)", strings.Join(vals, ", "))
75 qw.QueryString = append(qw.QueryString, segment) 76 qb.QueryTokens = append(qb.QueryTokens, segment)
76 return qw 77 return qb
77 } 78 }
78 79
79 func (qw *MySQLQueryBuilder) Subquery(sub string, alias string) string { 80 func (qb *MySQLQueryBuilder) OrderBy(fields ...string) QueryBuilder {
81 qb.QueryTokens = append(qb.QueryTokens, "ORDER BY "+strings.Join(fields, ", "))
82 return qb
83 }
84
85 func (qb *MySQLQueryBuilder) Asc() QueryBuilder {
86 qb.QueryTokens = append(qb.QueryTokens, "ASC")
87 return qb
88 }
89
90 func (qb *MySQLQueryBuilder) Desc() QueryBuilder {
91 qb.QueryTokens = append(qb.QueryTokens, "DESC")
92 return qb
93 }
94
95 func (qb *MySQLQueryBuilder) Limit(limit int) QueryBuilder {
96 qb.QueryTokens = append(qb.QueryTokens, "LIMIT "+strconv.Itoa(limit))
97 return qb
98 }
99
100 func (qb *MySQLQueryBuilder) Offset(offset int) QueryBuilder {
101 qb.QueryTokens = append(qb.QueryTokens, "OFFSET "+strconv.Itoa(offset))
102 return qb
103 }
104
105 func (qb *MySQLQueryBuilder) GroupBy(fields ...string) QueryBuilder {
106 qb.QueryTokens = append(qb.QueryTokens, "GROUP BY "+strings.Join(fields, ", "))
107 return qb
108 }
109
110 func (qb *MySQLQueryBuilder) Having(cond string) QueryBuilder {
111 qb.QueryTokens = append(qb.QueryTokens, "HAVING "+cond)
112 return qb
113 }
114
115 func (qb *MySQLQueryBuilder) Subquery(sub string, alias string) string {
80 return fmt.Sprintf("(%s) AS %s", sub, alias) 116 return fmt.Sprintf("(%s) AS %s", sub, alias)
81 } 117 }
82 118
83 func (qw *MySQLQueryBuilder) String() string { 119 func (qb *MySQLQueryBuilder) String() string {
84 return strings.Join(qw.QueryString, " ") 120 return strings.Join(qb.QueryTokens, " ")
85 } 121 }
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!