Skip to content

Commit c9a44f3

Browse files
committed
fix select sqlbuilder, so it can copy the condition
1 parent 6ecc7be commit c9a44f3

5 files changed

Lines changed: 130 additions & 125 deletions

File tree

qsql.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ func queryPageArr(db Queryer, ctx context.Context, querySql string, args ...inte
260260
}
261261

262262
for rows.Next() {
263-
r := makeDBData(len(titles))
263+
r := MakeDBData(len(titles))
264264
if err := rows.Scan(r...); err != nil {
265265
return titles, result, errors.As(err, args)
266266
}
@@ -287,7 +287,7 @@ func queryPageMap(db Queryer, ctx context.Context, querySql string, args ...inte
287287

288288
result := []map[string]interface{}{}
289289
for rows.Next() {
290-
r := makeDBData(len(titles))
290+
r := MakeDBData(len(titles))
291291
if err := rows.Scan(r...); err != nil {
292292
return titles, []map[string]interface{}{}, errors.As(err, args)
293293
}

reflect.go

Lines changed: 0 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -1,120 +1,15 @@
11
package qsql
22

33
import (
4-
"database/sql"
54
"database/sql/driver"
65
"fmt"
76
"reflect"
8-
"strconv"
97
"strings"
10-
"time"
118

129
"github.com/gwaylib/errors"
1310
"github.com/jmoiron/sqlx/reflectx"
1411
)
1512

16-
// Bool type
17-
type Bool bool
18-
19-
func (v *Bool) Scan(i interface{}) error {
20-
b := sql.NullBool{}
21-
if err := b.Scan(i); err != nil {
22-
return err
23-
}
24-
*v = Bool(b.Bool)
25-
return nil
26-
}
27-
func (v *Bool) Value() (driver.Value, error) {
28-
return v, nil
29-
}
30-
31-
// Int64 type
32-
type Int64 int64
33-
34-
func (v *Int64) Scan(i interface{}) error {
35-
b := sql.NullInt64{}
36-
if err := b.Scan(i); err != nil {
37-
return err
38-
}
39-
*v = Int64(b.Int64)
40-
return nil
41-
}
42-
func (v Int64) Value() (driver.Value, error) {
43-
return int64(v), nil
44-
}
45-
46-
// Float64 type
47-
type Float64 float64
48-
49-
func (v *Float64) Scan(i interface{}) error {
50-
b := sql.NullFloat64{}
51-
if err := b.Scan(i); err != nil {
52-
return err
53-
}
54-
*v = Float64(b.Float64)
55-
return nil
56-
}
57-
func (v Float64) Value() (driver.Value, error) {
58-
return float64(v), nil
59-
}
60-
61-
// String type
62-
type String string
63-
64-
func (v *String) Scan(i interface{}) error {
65-
b := sql.NullString{}
66-
if err := b.Scan(i); err != nil {
67-
return err
68-
}
69-
*v = String(b.String)
70-
return nil
71-
}
72-
func (v String) Value() (driver.Value, error) {
73-
return string(v), nil
74-
}
75-
func (v *String) String() string {
76-
return string(*v)
77-
}
78-
79-
// 通用的字符串查询
80-
type DBData string
81-
82-
func (d *DBData) Scan(i interface{}) error {
83-
if i == nil {
84-
*d = ""
85-
return nil
86-
}
87-
switch i.(type) {
88-
case int64:
89-
*d = DBData(strconv.FormatInt(i.(int64), 10))
90-
case float64:
91-
*d = DBData(strconv.FormatFloat(i.(float64), 'f', -1, 64))
92-
case []byte:
93-
*d = DBData(string(i.([]byte)))
94-
case string:
95-
*d = DBData(i.(string))
96-
case bool:
97-
*d = DBData(fmt.Sprintf("%t", i))
98-
case time.Time:
99-
*d = DBData(i.(time.Time).Format(time.RFC3339))
100-
default:
101-
*d = DBData(fmt.Sprint(i))
102-
}
103-
return nil
104-
}
105-
func (d *DBData) String() string {
106-
return string(*d)
107-
}
108-
109-
func makeDBData(l int) []interface{} {
110-
r := make([]interface{}, l)
111-
for i := 0; i < l; i++ {
112-
d := DBData("")
113-
r[i] = &d
114-
}
115-
return r
116-
}
117-
11813
var refxM = reflectx.NewMapperTagFunc("db", func(in string) string {
11914
// for tag name
12015
return in

sqlbuilder.go

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,6 @@ func NewSqlBuilder(drvName ...string) *SqlBuilder {
2020
return b
2121
}
2222

23-
func (b *SqlBuilder) String() string {
24-
return b.buff.String()
25-
}
26-
func (b *SqlBuilder) Args() []interface{} {
27-
return b.args
28-
}
29-
3023
func (b *SqlBuilder) Add(key string, args ...interface{}) *SqlBuilder {
3124
if len(key) > 0 {
3225
b.buff.WriteString(key)
@@ -42,7 +35,7 @@ func (b *SqlBuilder) AddTab(key string, args ...interface{}) *SqlBuilder {
4235
b.buff.WriteString(" ")
4336
return b.Add(key, args)
4437
}
45-
func (b *SqlBuilder) AddTabOk(ok bool, key string, args ...interface{}) *SqlBuilder {
38+
func (b *SqlBuilder) AddTabOK(ok bool, key string, args ...interface{}) *SqlBuilder {
4639
if !ok {
4740
return b
4841
}
@@ -57,17 +50,23 @@ func (b *SqlBuilder) In(in []interface{}) string {
5750
return stmtIn(len(b.args)-1, len(in), b.drvName)
5851
}
5952

53+
func (b *SqlBuilder) Args() []interface{} {
54+
return b.args
55+
}
56+
6057
func (b *SqlBuilder) Select(column ...string) string {
58+
selectStr := "SELECT\n "
6159
if len(column) > 0 {
62-
return strings.Join(column, ", ")
60+
selectStr += strings.Join(column, ", ")
6361
} else {
64-
return "*"
62+
selectStr += "*"
6563
}
64+
return selectStr + "\n" + b.buff.String()
6665
}
6766
func (b *SqlBuilder) SelectStruct(obj interface{}) string {
6867
fields, err := reflectInsertStruct(obj, b.drvName)
6968
if err != nil {
7069
panic(err)
7170
}
72-
return fields.Names
71+
return "SELECT\n " + fields.Names + "\n" + b.buff.String()
7372
}

sqlbuilder_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,23 @@ import (
77

88
func TestSqlBuilder(t *testing.T) {
99
sb := NewSqlBuilder(DRV_NAME_POSTGRES)
10-
sb.Add("SELECT")
11-
sb.AddTab(sb.Select("tb1.id", "count(*)"))
1210
sb.Add("FROM")
1311
sb.AddTab("tmp tb1")
1412
sb.AddTab("INNER JOIN tmp1 tb2 ON tb2.id=tb2.tmp_id")
1513
sb.Add("WHERE")
1614
sb.AddTab("1=1")
17-
sb.AddTabOk(false, "AND (1=?)", 0)
18-
sb.AddTab("OR (tb1 IN (" + sb.In([]interface{}{1, 2}) + "))")
15+
sb.AddTabOK(false, "AND (1=?)", 0)
16+
sb.AddTabOK(true, "OR (tb1 IN ("+sb.In([]interface{}{1, 2})+"))")
1917
sb.Add("GROUP BY tb1.id")
2018
sb.Add("HAVING count(*)>?", 1)
19+
fmt.Println(sb.Select("count(*)"))
20+
2121
sb.Add("ORDER BY tb1.id DESC")
2222
sb.Add("OFFSET ?", 1)
2323
sb.Add("LIMIT ?", 1)
24-
fmt.Println(sb)
24+
fmt.Println(sb.Select("tb1.id", "count(*)"))
2525

2626
sb1 := NewSqlBuilder(DRV_NAME_POSTGRES)
27-
sb1.Add("SELECT * FROM ("+sb.String()+") tmp", sb1.Args())
28-
fmt.Println(sb1)
27+
sb1.Add("FROM ("+sb.Select("tb1.id", "count(*)")+") tmp", sb.Args())
28+
fmt.Println(sb1.Select("*"))
2929
}

type.go

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package qsql
2+
3+
import (
4+
"database/sql"
5+
"database/sql/driver"
6+
"fmt"
7+
"strconv"
8+
"time"
9+
)
10+
11+
// Bool type
12+
type Bool bool
13+
14+
func (v *Bool) Scan(i interface{}) error {
15+
b := sql.NullBool{}
16+
if err := b.Scan(i); err != nil {
17+
return err
18+
}
19+
*v = Bool(b.Bool)
20+
return nil
21+
}
22+
func (v *Bool) Value() (driver.Value, error) {
23+
return v, nil
24+
}
25+
26+
// Int64 type
27+
type Int64 int64
28+
29+
func (v *Int64) Scan(i interface{}) error {
30+
b := sql.NullInt64{}
31+
if err := b.Scan(i); err != nil {
32+
return err
33+
}
34+
*v = Int64(b.Int64)
35+
return nil
36+
}
37+
func (v Int64) Value() (driver.Value, error) {
38+
return int64(v), nil
39+
}
40+
41+
// Float64 type
42+
type Float64 float64
43+
44+
func (v *Float64) Scan(i interface{}) error {
45+
b := sql.NullFloat64{}
46+
if err := b.Scan(i); err != nil {
47+
return err
48+
}
49+
*v = Float64(b.Float64)
50+
return nil
51+
}
52+
func (v Float64) Value() (driver.Value, error) {
53+
return float64(v), nil
54+
}
55+
56+
// String type
57+
type String string
58+
59+
func (v *String) Scan(i interface{}) error {
60+
b := sql.NullString{}
61+
if err := b.Scan(i); err != nil {
62+
return err
63+
}
64+
*v = String(b.String)
65+
return nil
66+
}
67+
func (v String) Value() (driver.Value, error) {
68+
return string(v), nil
69+
}
70+
func (v *String) String() string {
71+
return string(*v)
72+
}
73+
74+
// 通用的字符串查询
75+
type DBData string
76+
77+
func (d *DBData) Scan(i interface{}) error {
78+
if i == nil {
79+
*d = ""
80+
return nil
81+
}
82+
switch i.(type) {
83+
case int64:
84+
*d = DBData(strconv.FormatInt(i.(int64), 10))
85+
case float64:
86+
*d = DBData(strconv.FormatFloat(i.(float64), 'f', -1, 64))
87+
case []byte:
88+
*d = DBData(string(i.([]byte)))
89+
case string:
90+
*d = DBData(i.(string))
91+
case bool:
92+
*d = DBData(fmt.Sprintf("%t", i))
93+
case time.Time:
94+
*d = DBData(i.(time.Time).Format(time.RFC3339))
95+
default:
96+
*d = DBData(fmt.Sprint(i))
97+
}
98+
return nil
99+
}
100+
func (d *DBData) String() string {
101+
return string(*d)
102+
}
103+
104+
func MakeDBData(l int) []interface{} {
105+
r := make([]interface{}, l)
106+
for i := 0; i < l; i++ {
107+
d := DBData("")
108+
r[i] = &d
109+
}
110+
return r
111+
}

0 commit comments

Comments
 (0)