这几天研究了一下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);
有疑问加站长微信联系(非本文作者)
