在beego1.6.1版本orm中并未提供insertOrUpdate,但是自己做项目时遇到了这个需求,顾写了一个自己的实现,暂只支持mysql与postgres。实现原理是数据自带可实现insertorupdate的功能语句。
mysql:-ON DUPLICATE KEY UPDATE
postgres : -ON CONFLICT DO UPDATE SET
然后去orm实现中自己拼装sql语句
好了,亮代码:
func (d *dbBase) InsertOrUpdate(q dbQuerier, mi *modelInfo,ind reflect.Value, tz *time.Location, dn string, args …string)
(int64, error) {
iouStr := ""
mysql := "mysql"
postgres := "postgres"
argsMap := map[string]string{}
if dn == mysql {
iouStr = "ON DUPLICATE KEY UPDATE"
} else if dn == postgres && len(args) > 0 {
args0 = args[0]
iouStr = fmt.Sprintf("ON CONFLICT (%s) DO UPDATE SET", args0)
} else {
return 0, fmt.Errorf("`%s` nonsupport insert or update in beego", dn)
}
for _, v