Skip to content

Commit 68fdeda

Browse files
authored
Merge pull request #3 from scofieldpeng/dev
update table helper
2 parents 5e77733 + 748b1f7 commit 68fdeda

File tree

7 files changed

+339
-29
lines changed

7 files changed

+339
-29
lines changed

builder.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package mysql
2+
3+
import (
4+
"strings"
5+
)
6+
7+
// WhereBuilder用来构建xorm的engine所需的where模块
8+
// 使用方法很easy
9+
// mysql.NewWhereBuilder()
10+
// mysql.Add("id",1)
11+
// 然后使用的时候直接mysql.Select()
12+
type WhereBuilder struct {
13+
data map[string]interface{}
14+
}
15+
16+
func NewWhereBuilder(args ...map[string]interface{}) *WhereBuilder {
17+
wb := &WhereBuilder{
18+
data: make(map[string]interface{}),
19+
}
20+
if len(args) > 0 {
21+
wb.data = args[0]
22+
}
23+
24+
return wb
25+
}
26+
27+
// 添加参数,需要注意的是,原来的xorm中where条件是id>? AND id
28+
func (wb *WhereBuilder) Add(condition string, args interface{}) *WhereBuilder {
29+
wb.data[condition] = args
30+
return wb
31+
}
32+
33+
// 解析相关的参数
34+
func (wb *WhereBuilder) parseState(input string) string {
35+
input = strings.TrimSpace(input)
36+
if i := strings.LastIndexAny(input, "<>="); i == len(input)-1 {
37+
return input
38+
}
39+
return input + "="
40+
}
41+
42+
// Encode用来生成xorm的engine.Where()条件的两个参数
43+
func (wb *WhereBuilder) Encode() (whereStr string, beans []interface{}) {
44+
whereArr := make([]string, 0, len(wb.data))
45+
beans = make([]interface{}, 0, len(wb.data))
46+
for k, v := range wb.data {
47+
whereArr = append(whereArr, wb.parseState(k)+"?")
48+
beans = append(beans, v)
49+
}
50+
51+
return strings.Join(whereArr, " AND "), beans
52+
}

connect.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,13 +131,15 @@ func (e *engine) Slave(slave ...string) *xorm.Engine {
131131
if len(slave) != 0 {
132132
selectSlave = true
133133
}
134-
if !selectSlave {
134+
if !selectSlave && len(e.slaveNames) > 0 {
135135
slave = make([]string, 1)
136136
rand.Seed(time.Now().UnixNano())
137137
slave[0] = e.slaveNames[rand.Intn(len(e.slaveNamesMap))]
138+
139+
return engines[slave[0]].xormEngine
138140
}
139-
140-
return engines[slave[0]].xormEngine
141+
142+
return e.Engine()
141143
}
142144

143145
// 获取主节点

connect_test.go

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,35 +23,35 @@ func TestInit(t *testing.T) {
2323
MaxIdle: 5,
2424
MaxConn: 10,
2525
}
26-
26+
2727
if err := Init(mysqlConfig, testConfig); err != nil {
2828
t.Fatal("init fail!error:", err.Error())
2929
}
30-
31-
if res, err := Select().Engine().Exec("CREATE TABLE `test` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`value` int(11) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"); err != nil {
32-
t.Fatal("create table fail,error:", err)
33-
} else {
34-
if _, err := res.RowsAffected(); err != nil {
35-
t.Error("fetch affected num fail!error:", err)
36-
}
37-
}
38-
30+
31+
//if res, err := Select().Engine().Exec("CREATE TABLE `test` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`value` int(11) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"); err != nil {
32+
// t.Fatal("create table fail,error:", err)
33+
//} else {
34+
// if _, err := res.RowsAffected(); err != nil {
35+
// t.Error("fetch affected num fail!error:", err)
36+
// }
37+
//}
38+
3939
type Test struct {
40-
Id int `xorm:"not null pk autoincr INT(11)"`
41-
Value int `xorm:"not null INT(11)"`
40+
Id int `xorm:"not null pk autoincr INT(11)"`
41+
Value string `xorm:"not null VARCHAR(11) 'name'"`
4242
}
43-
43+
4444
if _, err := Select().Slave().Insert(&Test{
45-
Id: 1,
46-
Value: 2,
45+
//Id: 1,
46+
Value: "scofield",
4747
}); err != nil {
4848
t.Error("insert fail,error:", err)
4949
}
50-
50+
5151
ts := Test{
5252
Id: 1,
5353
}
54-
54+
5555
if exist, err := Select().Slave("slave2").Get(&ts); err != nil {
5656
t.Error("get data fail!error:", err)
5757
} else if !exist {

go.mod

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
module github.com/scofieldpeng/mysql-go
22

33
require (
4-
github.com/go-sql-driver/mysql v1.4.0
4+
github.com/go-sql-driver/mysql v1.4.1
55
github.com/go-xorm/core v0.6.0
6-
github.com/go-xorm/xorm v0.7.0
6+
github.com/go-xorm/xorm v0.7.1
7+
github.com/scofieldpeng/config v0.0.0-20180529180040-2470942ddc14
78
github.com/scofieldpeng/config-go v0.0.0-20180904140723-f66897e4003d // indirect
89
github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec
9-
)
10+
)

go.sum

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,34 @@
1-
github.com/go-sql-driver/mysql v1.4.0 h1:7LxgVwFb2hIQtMm87NdgAVfXjnt4OePseqT1tKx+opk=
1+
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
2+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3+
github.com/denisenkom/go-mssqldb v0.0.0-20181014144952-4e0d7dc8888f/go.mod h1:xN/JuLBIz4bjkxNmByTiV1IbhfnYb6oo99phBn4Eqhc=
24
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
3-
github.com/go-xorm/builder v0.0.0-20180322150003-a9b7ffcca3f0 h1:6cLhxUWQkTTOJ8VR6QzF9aaSP6Qm8fl7EKO1+KPz3dY=
4-
github.com/go-xorm/builder v0.0.0-20180322150003-a9b7ffcca3f0/go.mod h1:v8mE3MFBgtL+RGFNfUnAMUqqfk/Y4W5KuwCFQIEpQLk=
5-
github.com/go-xorm/core v0.0.0-20180322150003-0177c08cee88/go.mod h1:d8FJ9Br8OGyQl12MCclmYBuBqqxsyeedpXciV5Myih8=
5+
github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
6+
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
7+
github.com/go-xorm/builder v0.3.2 h1:pSsZQRRzJNapKEAEhigw3xLmiLPeAYv5GFlpYZ8+a5I=
8+
github.com/go-xorm/builder v0.3.2/go.mod h1:v8mE3MFBgtL+RGFNfUnAMUqqfk/Y4W5KuwCFQIEpQLk=
69
github.com/go-xorm/core v0.6.0 h1:tp6hX+ku4OD9khFZS8VGBDRY3kfVCtelPfmkgCyHxL0=
710
github.com/go-xorm/core v0.6.0/go.mod h1:d8FJ9Br8OGyQl12MCclmYBuBqqxsyeedpXciV5Myih8=
8-
github.com/go-xorm/xorm v0.7.0 h1:u3X44NiN3ggNeeJO3f1xmHIFGAqh3qmCWS3ROuIBWmU=
9-
github.com/go-xorm/xorm v0.7.0/go.mod h1:xkHEPeHG0ckC95t/J9vR4tr4gE4944G/kGnDCGLAxlA=
11+
github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:56xuuqnHyryaerycW3BfssRdxQstACi0Epw/yC5E2xM=
12+
github.com/go-xorm/xorm v0.7.1 h1:Kj7mfuqctPdX60zuxP6EoEut0f3E6K66H6hcoxiHUMc=
13+
github.com/go-xorm/xorm v0.7.1/go.mod h1:EHS1htMQFptzMaIHKyzqpHGw6C9Rtug75nsq6DA9unI=
14+
github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ=
15+
github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I=
16+
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
17+
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
18+
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
19+
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
20+
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
21+
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
22+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
23+
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
24+
github.com/scofieldpeng/config v0.0.0-20180529180040-2470942ddc14 h1:50f1oLSuS/1zZd67pKgYOIerbtcUrd//v9R/+zw5pjg=
25+
github.com/scofieldpeng/config v0.0.0-20180529180040-2470942ddc14/go.mod h1:wcMTzJQdTX8Ogb8vQdfrBpL9+Y/UXPKep/nHKXqTYzY=
1026
github.com/scofieldpeng/config-go v0.0.0-20180904140723-f66897e4003d h1:9tk4bEYdVJZzBaEUOv9L+05uoD3rWFFlEMoAT081QFA=
1127
github.com/scofieldpeng/config-go v0.0.0-20180904140723-f66897e4003d/go.mod h1:2xJ5ThDG8nm1yFA7fu7AmPFWC6QrAAtY9Nk8OjoZ62M=
28+
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
29+
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
1230
github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec h1:DGmKwyZwEB8dI7tbLt/I/gQuP559o/0FrAkHKlQM/Ks=
1331
github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec/go.mod h1:owBmyHYMLkxyrugmfwE/DLJyW8Ro9mkphwuVErQ0iUw=
32+
github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
33+
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
34+
gopkg.in/stretchr/testify.v1 v1.2.2/go.mod h1:QI5V/q6UbPmuhtm10CaFZxED9NreB8PnFYN9JcR6TxU=

table.go

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
package mysql
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"github.com/go-xorm/xorm"
7+
"strings"
8+
)
9+
10+
type Table interface {
11+
SelfObj() *xorm.TableName
12+
}
13+
14+
type TableFactory struct {
15+
tableNode string `json:"-" xorm:"-" xml:"-"`
16+
myself func() interface{}
17+
}
18+
19+
func (tf TableFactory) checkNode() error {
20+
if tf.tableNode == "" {
21+
return errors.New("table_node not set")
22+
}
23+
24+
return nil
25+
}
26+
27+
// 校验
28+
func (tf TableFactory) check() error {
29+
if err := tf.checkNode(); err != nil {
30+
return err
31+
}
32+
33+
return nil
34+
}
35+
36+
func (tf TableFactory) TableNode() string {
37+
return tf.tableNode
38+
}
39+
40+
func (tf TableFactory) Myself() interface{} {
41+
return tf.myself()
42+
}
43+
44+
func (tf *TableFactory) Insert() (affectRows int64, err error) {
45+
if err := tf.check(); err != nil {
46+
return affectRows, err
47+
}
48+
49+
affectRows, err = Select(tf.TableNode()).Master().Insert(tf.Myself())
50+
return
51+
}
52+
53+
// 删除表结构
54+
func (tf *TableFactory) Delete() (int64, error) {
55+
return Select(tf.TableNode()).Master().Delete(tf.Myself())
56+
}
57+
58+
// 查询一条数据
59+
func (tf *TableFactory) Get(fromMaster ...bool) (bool, error) {
60+
if len(fromMaster) > 0 && fromMaster[0] {
61+
return Select(tf.TableNode()).Master().Get(tf.Myself())
62+
}
63+
64+
return Select(tf.TableNode()).Slave().Get(tf.Myself())
65+
}
66+
67+
// 查询列表
68+
func (tf *TableFactory) Find(whereBuilder *WhereBuilder, fields string, orderBy string, listResult interface{}, fromMaster ...bool) (err error) {
69+
var (
70+
session *xorm.Session
71+
master = false
72+
whereData = ""
73+
whereArgs []interface{}
74+
)
75+
76+
whereData, whereArgs = whereBuilder.Encode()
77+
if len(whereData) == 0 {
78+
return errors.New("where condition required")
79+
}
80+
fmt.Printf("where: %s\n", whereData)
81+
fmt.Printf("args: %v\n", whereArgs)
82+
83+
if len(fromMaster) > 0 && fromMaster[0] {
84+
master = true
85+
}
86+
87+
if master {
88+
session = Select(tf.TableNode()).Master().NewSession()
89+
} else {
90+
session = Select(tf.TableNode()).Slave().NewSession()
91+
}
92+
93+
if len(fields) == 0 {
94+
session.AllCols()
95+
} else {
96+
session.Cols(strings.Split(fields, ",")...)
97+
}
98+
99+
session.Where(whereData, whereArgs...)
100+
101+
fmt.Printf("%v\n", whereData)
102+
fmt.Printf("%v\n", whereArgs)
103+
104+
if orderBy != "" {
105+
session.OrderBy(orderBy)
106+
}
107+
108+
if err := session.Table(tf.Myself()).Find(listResult); err != nil {
109+
return err
110+
}
111+
112+
return err
113+
}
114+
115+
// 更新表
116+
func (tf *TableFactory) Update(whereBuilder *WhereBuilder, updateFields ...string) (int64, error) {
117+
var (
118+
whereStr string
119+
whereData []interface{}
120+
session *xorm.Session
121+
)
122+
if err := tf.check(); err != nil {
123+
return 0, err
124+
}
125+
126+
session = Select(tf.TableNode()).Master().NewSession()
127+
whereStr, whereData = whereBuilder.Encode()
128+
if whereStr != "" {
129+
session.Where(whereStr, whereData...)
130+
}
131+
if len(updateFields) == 0 {
132+
session.AllCols()
133+
} else {
134+
session.Cols(updateFields...)
135+
}
136+
137+
return session.Update(tf.Myself())
138+
}

0 commit comments

Comments
 (0)