分享
  1. 首页
  2. 文章

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

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

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

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

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏