-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #3 from scofieldpeng/dev
update table helper
- Loading branch information
Showing
7 changed files
with
339 additions
and
29 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
) | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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= |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()) | ||
} |
Oops, something went wrong.