Skip to content

Commit

Permalink
Merge pull request #3 from scofieldpeng/dev
Browse files Browse the repository at this point in the history
update table helper
  • Loading branch information
scofieldpeng authored Nov 25, 2018
2 parents 5e77733 + 748b1f7 commit 68fdeda
Show file tree
Hide file tree
Showing 7 changed files with 339 additions and 29 deletions.
52 changes: 52 additions & 0 deletions builder.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package mysql

import (
"strings"
)

// WhereBuilder用来构建xorm的engine所需的where模块
// 使用方法很easy
// mysql.NewWhereBuilder()
// mysql.Add("id",1)
// 然后使用的时候直接mysql.Select()
type WhereBuilder struct {
data map[string]interface{}
}

func NewWhereBuilder(args ...map[string]interface{}) *WhereBuilder {
wb := &WhereBuilder{
data: make(map[string]interface{}),
}
if len(args) > 0 {
wb.data = args[0]
}

return wb
}

// 添加参数,需要注意的是,原来的xorm中where条件是id>? AND id
func (wb *WhereBuilder) Add(condition string, args interface{}) *WhereBuilder {
wb.data[condition] = args
return wb
}

// 解析相关的参数
func (wb *WhereBuilder) parseState(input string) string {
input = strings.TrimSpace(input)
if i := strings.LastIndexAny(input, "<>="); i == len(input)-1 {
return input
}
return input + "="
}

// Encode用来生成xorm的engine.Where()条件的两个参数
func (wb *WhereBuilder) Encode() (whereStr string, beans []interface{}) {
whereArr := make([]string, 0, len(wb.data))
beans = make([]interface{}, 0, len(wb.data))
for k, v := range wb.data {
whereArr = append(whereArr, wb.parseState(k)+"?")
beans = append(beans, v)
}

return strings.Join(whereArr, " AND "), beans
}
8 changes: 5 additions & 3 deletions connect.go
Original file line number Diff line number Diff line change
Expand Up @@ -131,13 +131,15 @@ func (e *engine) Slave(slave ...string) *xorm.Engine {
if len(slave) != 0 {
selectSlave = true
}
if !selectSlave {
if !selectSlave && len(e.slaveNames) > 0 {
slave = make([]string, 1)
rand.Seed(time.Now().UnixNano())
slave[0] = e.slaveNames[rand.Intn(len(e.slaveNamesMap))]

return engines[slave[0]].xormEngine
}

return engines[slave[0]].xormEngine
return e.Engine()
}

// 获取主节点
Expand Down
34 changes: 17 additions & 17 deletions connect_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,35 +23,35 @@ func TestInit(t *testing.T) {
MaxIdle: 5,
MaxConn: 10,
}

if err := Init(mysqlConfig, testConfig); err != nil {
t.Fatal("init fail!error:", err.Error())
}

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 {
t.Fatal("create table fail,error:", err)
} else {
if _, err := res.RowsAffected(); err != nil {
t.Error("fetch affected num fail!error:", err)
}
}

//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 {
// t.Fatal("create table fail,error:", err)
//} else {
// if _, err := res.RowsAffected(); err != nil {
// t.Error("fetch affected num fail!error:", err)
// }
//}
type Test struct {
Id int `xorm:"not null pk autoincr INT(11)"`
Value int `xorm:"not null INT(11)"`
Id int `xorm:"not null pk autoincr INT(11)"`
Value string `xorm:"not null VARCHAR(11) 'name'"`
}

if _, err := Select().Slave().Insert(&Test{
Id: 1,
Value: 2,
//Id: 1,
Value: "scofield",
}); err != nil {
t.Error("insert fail,error:", err)
}

ts := Test{
Id: 1,
}

if exist, err := Select().Slave("slave2").Get(&ts); err != nil {
t.Error("get data fail!error:", err)
} else if !exist {
Expand Down
7 changes: 4 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
module github.com/scofieldpeng/mysql-go

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

import (
"errors"
"fmt"
"github.com/go-xorm/xorm"
"strings"
)

type Table interface {
SelfObj() *xorm.TableName
}

type TableFactory struct {
tableNode string `json:"-" xorm:"-" xml:"-"`
myself func() interface{}
}

func (tf TableFactory) checkNode() error {
if tf.tableNode == "" {
return errors.New("table_node not set")
}

return nil
}

// 校验
func (tf TableFactory) check() error {
if err := tf.checkNode(); err != nil {
return err
}

return nil
}

func (tf TableFactory) TableNode() string {
return tf.tableNode
}

func (tf TableFactory) Myself() interface{} {
return tf.myself()
}

func (tf *TableFactory) Insert() (affectRows int64, err error) {
if err := tf.check(); err != nil {
return affectRows, err
}

affectRows, err = Select(tf.TableNode()).Master().Insert(tf.Myself())
return
}

// 删除表结构
func (tf *TableFactory) Delete() (int64, error) {
return Select(tf.TableNode()).Master().Delete(tf.Myself())
}

// 查询一条数据
func (tf *TableFactory) Get(fromMaster ...bool) (bool, error) {
if len(fromMaster) > 0 && fromMaster[0] {
return Select(tf.TableNode()).Master().Get(tf.Myself())
}

return Select(tf.TableNode()).Slave().Get(tf.Myself())
}

// 查询列表
func (tf *TableFactory) Find(whereBuilder *WhereBuilder, fields string, orderBy string, listResult interface{}, fromMaster ...bool) (err error) {
var (
session *xorm.Session
master = false
whereData = ""
whereArgs []interface{}
)

whereData, whereArgs = whereBuilder.Encode()
if len(whereData) == 0 {
return errors.New("where condition required")
}
fmt.Printf("where: %s\n", whereData)
fmt.Printf("args: %v\n", whereArgs)

if len(fromMaster) > 0 && fromMaster[0] {
master = true
}

if master {
session = Select(tf.TableNode()).Master().NewSession()
} else {
session = Select(tf.TableNode()).Slave().NewSession()
}

if len(fields) == 0 {
session.AllCols()
} else {
session.Cols(strings.Split(fields, ",")...)
}

session.Where(whereData, whereArgs...)

fmt.Printf("%v\n", whereData)
fmt.Printf("%v\n", whereArgs)

if orderBy != "" {
session.OrderBy(orderBy)
}

if err := session.Table(tf.Myself()).Find(listResult); err != nil {
return err
}

return err
}

// 更新表
func (tf *TableFactory) Update(whereBuilder *WhereBuilder, updateFields ...string) (int64, error) {
var (
whereStr string
whereData []interface{}
session *xorm.Session
)
if err := tf.check(); err != nil {
return 0, err
}

session = Select(tf.TableNode()).Master().NewSession()
whereStr, whereData = whereBuilder.Encode()
if whereStr != "" {
session.Where(whereStr, whereData...)
}
if len(updateFields) == 0 {
session.AllCols()
} else {
session.Cols(updateFields...)
}

return session.Update(tf.Myself())
}
Loading

0 comments on commit 68fdeda

Please sign in to comment.