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

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

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

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