这几天研究了一下golang的Tag,发现是个好东西;于是就用它做了一个自己用的数据映射SQL的逻辑。现在分享出来给大家。
先上核心逻辑
//生成更新SQL
func MarshalUpSql(v interface{}, tablename string) (sql string) {
result := util.NewStringBuilder()
result.Append("INSERT INTO ")
result.Append(tablename)
result.Append("(")
t := reflect.TypeOf(v)
farr := t.Elem()
tmp := util.NewStringBuilder()
vtmp := util.NewStringBuilder()
Fieldfor:
for i := 0; i < farr.NumField(); i++ {
field := farr.Field(i)
bigetag := field.Tag.Get("bige")
narr := strings.Split(bigetag, ",")
name := field.Name
iskey := false
for _, v := range narr {
switch v {
case "bigekey":
iskey = true
case "select":
case "-":
continue Fieldfor
default:
name = v
}
}
if !tmp.IsEmpty() {
result.Append(",")
tmp.Append(",")
}
result.Append(name)
tmp.Append("?")
if !iskey {
if !vtmp.IsEmpty() {
vtmp.Append(",")
}
vtmp.Append(name)
vtmp.Append("=values(")
vtmp.Append(name)
vtmp.Append(")")
}
}
result.Append(")VALUES(")
result.Append(tmp.ToString())
result.Append(") ON DUPLICATE KEY UPDATE ")
result.Append(vtmp.ToString())
result.Append(";")
return result.ToString()
}
这就是通过识别Sturct的tag属性来生成插入更新的sql语句的。
下面给一个对应的struct是怎么写的
type MemberMD struct {
MemberID int `bige:"memberid,bigekey"` //用户ID
UserName string `bige:"username"` //
Pwd string `bige:"pwd"` //
DriveID string `bige:"driveid"` //
OStype string `bige:"ostype"` //
CreateIP string `bige:"createip"` //
PlatFormID string `bige:"platformid"` //
ChanID string `bige:"chanid"` //渠道ID
OpenID string `bige:"openid"` //用户唯一标识
UnionID string `bige:"unionid"` //同一用户,对同一个微信开放平台下的不同应用,unionid是相同的
CreateTime time.Time `bige:"createtime"` //
LoginTime time.Time `bige:"logintime"` //
BanTime time.Time `bige:"bantime"` //
ServerID int `bige:"serverid"` //
}
里面的bige就是你自己定义的tag名字
后面的属性用逗号分格,定义几个关键字用来表示主键啊,条件啊,跳过等信息,然后就是字段名;
像我里面定义的bigekey就是表示这个字段是主键,在更新的时候,不做为更新字段;
生成的结果如下:
INSERT INTO member
(memberid,username,pwd,driveid,ostype,createip,
platformid,chanid,openid,unionid,createtime,logintime,bantime,serverid)
VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)
ON DUPLICATE KEY UPDATE
username=values(username),
pwd=values(pwd),
driveid=values(driveid),
ostype=values(ostype),
createip=values(createip),
platformid=values(platformid),
chanid=values(chanid),
openid=values(openid),
unionid=values(unionid),
createtime=values(createtime),
logintime=values(logintime),
bantime=values(bantime),
serverid=values(serverid);
有疑问加站长微信联系(非本文作者)