more complete support for sql language
Showing
2 changed files
with
80 additions
and
37 deletions
| ... | @@ -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 | } | ... | ... |
-
Please register or sign in to post a comment