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

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

https://github.com/buguang01

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Oracle提供的go库 "github.com/godror/godror" 来实现。 以下是一个示例程序,用于向Oracle数据库中的表插入日期数据: ```go package main import ( "context" "database/sql" "fmt" "time" "github.com/godror/godror" ) func main() { // 创建一个Oracle数据库连接 dsn := godror.ConnectionParams{ Username: "username", Password: "password", SID: "sid", } db, err := sql.Open("godror", dsn.StringWithPassword()) if err != nil { panic(err) } defer db.Close() // 准备Insert语句 query := `INSERT INTO my_table (id, my_date) VALUES (:1, :2)` stmt, err := db.PrepareContext(context.Background(), query) if err != nil { panic(err) } defer stmt.Close() // 准备要插入的日期数据 myDate := time.Date(2021, 10, 1, 0, 0, 0, 0, time.UTC) // 执行Insert语句 result, err := stmt.ExecContext(context.Background(), 1, myDate) if err != nil { panic(err) } // 输出Insert结果 rowsAffected, err := result.RowsAffected() if err != nil { panic(err) } fmt.Printf("%d rows affected\n", rowsAffected) } ``` 在上面的示例程序中,我们使用 `time.Date` 函数创建了一个日期对象,然后将其作为参数插入到Insert语句中。在执行Insert语句时,我们使用了 `stmt.ExecContext` 函数,该函数的第二个参数是要插入的日期数据。 需要注意的是,Oracle数据库中的date类型数据golang中的time.Time类型数据具有不同的格式。在这种情况下,godror库会自动将golang的time.Time类型数据转换为Oracle的date类型数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值