使用Tag实现生成SQL执行方法。数据映射

buguang01 · · 1325 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

这几天研究了一下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);

 


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1325 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传